konto usunięte

Temat: Jeszcze jeden powód, z którego PHP sucks

Będąc kontekście klasy-rodzica Jarek chce pracować w kontekście klasy-dziecka.

Jeżeli to jest tak, to nie powinienem mieć w ogóle możliwości napisać ChildClass::staticMethod(), bo odwołuję się wtedy na kontekst dziecka. Powinienby zapaść błąd "Fatal error: Call to nonexistent method ChildClass::staticMethod()", bo metoda istnieje w ParentClass, a nie w ChildClass. Gdzie logika?
Tomasz Niewolik

Tomasz Niewolik
Programista/Projekta
nt

Temat: Jeszcze jeden powód, z którego PHP sucks

Tu sprawa jest prosta, skoro jest publiczna, to musi być widoczna, w końcu ją dziedziczymy, a że jest statyczna to odwołujemy się w kontekście parenta! Tłumaczyłem ci to już wcześniej na podstawie wskaźników do pamięci...
Zbigniew Matuszewski

Zbigniew Matuszewski Programista
aplikacji webowych

Temat: Jeszcze jeden powód, z którego PHP sucks

Tak z ciekawości - czemu to powinna być metoda statyczna, a nie np. singleton lub zainstancjonowanie obiektu i wywołanie metody?

Paradoksalnie z punktu widzenia performance często lepiej działa metoda wywoływana na zainstancjonowanym obiekcie niż metoda statyczna w PHP. No chyba, że obiekt ma masę pól, masywny konstruktor itp.

PHP nie przewidział przeciążania i przesłaniania pól statycznych. Co zresztą byłoby niezbyt zgodne z OOP. Do wersji 5.3 nie przewidział też sprawdzania nazwy klasy z poziomu statycznego. W sumie można by było zrobić to okrężną drogą - wywołać wyjątek, przechwycić go i na bazie stack trace sprawdzić nazwę. Niezły overkill moim zdaniem. Zresztą tak działa chyba jeden z przykładów na necie.

Ciekawe na co wskazuje __FILE__ podczas wywoływania takiej metody. Ale stawiałbym, że na plik parenta. To byłoby logiczne.

W Java zresztą też nie jest to takie łatwe. Zdarzyło mi się kiedyś w przypływie rozpaczy to tak zrobić, że dodałem statyczną metodę w której zrzucałem i łapałem wyjątek z którego wyciągałem class name. ;)
Nie pamiętam już niestety czemu mi to było do szczęścia potrzebne.

W Java można też użyć: System.getSecurityManager().getClassContext()[0].getName();

Może są też inne sposoby. To tak rzadko jest potrzebne, że nigdy nie zagłębiałem się bardzo w ten temat.Zbigniew Matuszewski edytował(a) ten post dnia 09.07.10 o godzinie 02:00



Wyślij zaproszenie do