Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> Wywołanie call_user_func
thre4d
post 4.08.2009, 14:53:31
Post #1





Grupa: Zarejestrowani
Postów: 4
Pomógł: 0
Dołączył: 4.08.2009

Ostrzeżenie: (0%)
-----


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?

Ten post edytował thre4d 4.08.2009, 18:32:00
Go to the top of the page
+Quote Post
erix
post 4.08.2009, 15:10:13
Post #2





Grupa: Moderatorzy
Postów: 15 467
Pomógł: 1451
Dołączył: 25.04.2005
Skąd: Szczebrzeszyn/Rzeszów




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. [;


--------------------

ZCE :: Pisząc PW załączaj LINK DO TEMATU i TYLKO w sprawach moderacji :: jakiś błąd - a TREŚĆ BŁĘDU? :: nie ponaglaj z odpowiedzią via PW!
Go to the top of the page
+Quote Post
thre4d
post 4.08.2009, 15:32:51
Post #3





Grupa: Zarejestrowani
Postów: 4
Pomógł: 0
Dołączył: 4.08.2009

Ostrzeżenie: (0%)
-----


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); .
Go to the top of the page
+Quote Post
-=Peter=-
post 4.08.2009, 15:41:25
Post #4





Grupa: Zarejestrowani
Postów: 304
Pomógł: 51
Dołączył: 4.02.2005
Skąd: Kraków

Ostrzeżenie: (0%)
-----


Podejżewam że u Ciebie zmienna $arguments jest tablicą argumentów, więc powinieneś używać funkcji call_user_func_array().


--------------------
Go to the top of the page
+Quote Post
wookieb
post 4.08.2009, 15:44:37
Post #5





Grupa: Moderatorzy
Postów: 8 989
Pomógł: 1550
Dołączył: 8.08.2008
Skąd: Słupsk/Gdańsk




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. ?>


Ten post edytował wookieb 4.08.2009, 15:45:06


--------------------
Go to the top of the page
+Quote Post
thre4d
post 4.08.2009, 17:20:13
Post #6





Grupa: Zarejestrowani
Postów: 4
Pomógł: 0
Dołączył: 4.08.2009

Ostrzeżenie: (0%)
-----


-=Peter=- - Zmienna $arguments = NULL

Ten post edytował thre4d 4.08.2009, 18:34:30
Go to the top of the page
+Quote Post
wookieb
post 4.08.2009, 17:46:45
Post #7





Grupa: Moderatorzy
Postów: 8 989
Pomógł: 1550
Dołączył: 8.08.2008
Skąd: Słupsk/Gdańsk




Przeczytaj jeszcze raz co napisałem i zobacz jak masz u siebie.


--------------------
Go to the top of the page
+Quote Post
thre4d
post 4.08.2009, 18:34:04
Post #8





Grupa: Zarejestrowani
Postów: 4
Pomógł: 0
Dołączył: 4.08.2009

Ostrzeżenie: (0%)
-----


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.
Go to the top of the page
+Quote Post
wookieb
post 4.08.2009, 18:35:59
Post #9





Grupa: Moderatorzy
Postów: 8 989
Pomógł: 1550
Dołączył: 8.08.2008
Skąd: Słupsk/Gdańsk




Ale ten kod, który podałem działa. Sprawdź. Wszystko już jest ok.


--------------------
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Wersja Lo-Fi Aktualny czas: 22.06.2025 - 14:42