[php] wywołanie metody statycznej z metody statycznej

Języki, których efekty są wykonywane po stronie serwera. PHP, ASP czy CGI w połączeniu z bazami danych SQL dają niezwykłe możliwości budowy i zarządzania stron WWW. Tu zadajemy pytania oraz demonstrujemy kod, z którym mamy problem.
porneL
Nowy
Nowy
Posty: 161
Rejestracja: sob lis 27, 2004 7:50 pm
Lokalizacja: Londyn
Kontakt:

[php] wywołanie metody statycznej z metody statycznej

Post autor: porneL »

PHP5:
[php]
class Foo
{
static function A() {Foo::B();}
static function B() {echo 'Foo';}
};

class Bar extends Foo
{
static function B() {echo 'Bar';}
};

Bar::A();
[/php]

Wyświetla "Foo", a nie "Bar". Konieczność podana nazwy klasy medoty statycznej omija dziedziczenie :(

Jak z Foo::A wywołać Bar::B nie znając nazwy klasy Bar? (bo Foo może dziedziczyć kilka klas lub dziedziczenie może być wielokrotne)

Jak wewnątrz metody statycznej poznać nazwę klasy na rzecz której wywołano metodę?
splatch
Nowy
Nowy
Posty: 36
Rejestracja: śr gru 04, 2002 7:05 pm
Lokalizacja: Bydgoszcz/Brodnica
Kontakt:

Re: [php] wywołanie metody statycznej z metody statycznej

Post autor: splatch »

Błąd wynika z tąd, że w klasie A masz już metodę B, i jeśli druga klasa z niej dziedziczy to zostaje ona nadpisana (B::Bar = A::Bar). Aby tego uniknąć użyj słowa kluczowego final:
final static function B() { echo 'xx'; }
Powoduje ono to, że przy dziedziczeniu metoda, przed którą znajduje się final nie zostanie nadpisana.
Ostatnio zmieniony pn lut 13, 2006 8:42 am przez splatch, łącznie zmieniany 1 raz.
porneL
Nowy
Nowy
Posty: 161
Rejestracja: sob lis 27, 2004 7:50 pm
Lokalizacja: Londyn
Kontakt:

Re: [php] wywołanie metody statycznej z metody statycznej

Post autor: porneL »

No ja właśnie chciałbym, żeby sie zachowało odwrotnie niż z final. Żeby została nadpisana i została użyta...

Sprawdzalem w paru miejscach i okazuje się, że PHP po prostu nie obsługuje static i dziedzieczenia naraz. Najlepsze co można zrobić to znaleźć nazwę rzeczywistej klasy w debug_backtrace() i posiłkować się call_user_func().
ODPOWIEDZ