Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Wywołanie call_user_func
Forum PHP.pl > Forum > PHP
thre4d
Powitać.

Mam do czynienia z następującym problemem: klasa B dziedziczy po klasie A. W klasach dziedziczących po A chcę sprawdzać czy istnieje w nich jakaś metoda przy pomocy if (method_exists($this, $command), następnie jeśli została ona odnaleziona, powinna zostać wywołana poprzez call_user_func($command, $arguments); . Ponieważ czynność ta będzie powtarzać się w każdej klasie potomnej po A, chcę to zrobić jak należy, poprzez zapisanie tego w postaci metody klasy A. Tak więc mamy:

  1. <?php
  2. class A {
  3.  
  4. protected function CheckMethod($command, $arguments=null)
  5. {
  6.       // dajmy na to, że $command = 'jakasMetoda'
  7.       if (method_exists($this, $command))
  8.       {echo 'Znaleziono!';
  9.         call_user_func(array($this, $command), $arguments);
  10.       }
  11. }
  12. }
  13. ?>



  1. <?php
  2. class B extends A {
  3.  
  4.   public function __construct($command, $arguments=null)
  5.    {  
  6.        $this -> CheckMethod($command, $arguments);
  7.    }
  8.  
  9.   protected function jakasMetoda()
  10.   {
  11.        echo 'OK';
  12.   }
  13. }
  14. ?>



I owszem, tworzę obiekt klasy B, if (method_exists($this, $command)) zwraca TRUE, metoda jakasMetoda jest widziana w klasie potomnej ( B ), ale wywołanie jej kończy się komunikatem First argument is expected to be a valid callback in (...) .

Gdy umieszczę metodę CheckMethod() w klasie potomnej, to naturalnie wszystko działa poprawnie. Nie chcę jednak ładować tego kodu do każdej z klas, bo po to mam mechanizm dziedziczenia aby oszczędzić sobie nadmiarowej roboty.

Jakieś pomysły?
erix
Każdy callback w PHP może być wywołany dla dowolnego (nie)zinstancjowanego obiektu:

  1. <?php
  2. $x = new x();
  3.  
  4. call_user_func(array($x, 'metoda'), $args);
  5. ?>


Aby u Ciebie działało, musisz podstawić pewną szczególną zmienną, to zadanie domowe. [;
thre4d
Aj. Przykład pisałem na szybko, więc lekko go... zdeprawowałem - zamiast call_user_func($command, $arguments); używam call_user_func(array($this, $command), $arguments); .
-=Peter=-
Podejżewam że u Ciebie zmienna $arguments jest tablicą argumentów, więc powinieneś używać funkcji call_user_func_array().
wookieb
Metoda, która chcesz wywołać musi być publiczna (public) badz chroniona (protected)
  1. <?php
  2. class A {
  3.  
  4.    protected function CheckMethod($command, $arguments=null)
  5.    {
  6.        // dajmy na to, że $command = 'jakasMetoda'
  7.        
  8.        if (method_exists($this, $command))
  9.        {
  10.            echo 'Znaleziono!';
  11.            
  12.            call_user_func(array($this, $command), $arguments);
  13.        }
  14.    }
  15. }
  16.  
  17.  
  18. class B extends A {
  19.  
  20.  public function __construct($command, $arguments=null)
  21.   {  
  22.       $this -> CheckMethod($command);
  23.   }
  24.  
  25.  protected function jakasMetoda()
  26.  {
  27.       echo 'OK';
  28.  }
  29. }
  30.  
  31. $b=new B('jakasMetoda');
  32. ?>
thre4d
-=Peter=- - Zmienna $arguments = NULL
wookieb
Przeczytaj jeszcze raz co napisałem i zobacz jak masz u siebie.
thre4d
wookieb - Zwracam honor. Przykład pisałem pod będąc pod wpływem środków wyskokowych. W rzeczywistym kodzie moja metoda jest chroniona, więc problem leży gdzieś indziej.
wookieb
Ale ten kod, który podałem działa. Sprawdź. Wszystko już jest ok.
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.