![]() |
![]() ![]() |
![]() |
![]() ![]()
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:
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 |
|
|
![]()
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:
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! |
|
|
![]()
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); .
|
|
|
![]()
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().
-------------------- |
|
|
![]()
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)
Ten post edytował wookieb 4.08.2009, 15:45:06 -------------------- |
|
|
![]()
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 |
|
|
![]()
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.
-------------------- |
|
|
![]()
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.
|
|
|
![]()
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.
-------------------- |
|
|
![]() ![]() |
![]() |
Wersja Lo-Fi | Aktualny czas: 22.06.2025 - 14:42 |