Implementacja obiektów w PHP nie przestaje mnie zaskakiwać. Łatwo wpakować się w pułapkę.
Jest sobie funkcja get_parent_class([$obj]). Teoretycznie zwraca nazwę klasy – rodzica obiektu $obj. Parametr $obj jest opcjonalny, jeśli funkcja jest wywoływana wewnątrz metody – wówczas zwraca rodzica bieżącego obiektu – a przynajmniej tak się powinno wydawać.
class A {} class B extends A { function printParent() { echo get_parent_class(); } } $obj = new B(); echo $obj->printParent(); // wyświetli 'A'
Czyli zgodnie z oczekiwaniami. Jeśli jednak napiszemy taki kod:
class A {} class B extends A { function printParent() { echo get_parent_class(); } } class C extends B {} $obj = new C(); echo $obj->printParent(); // oczekujemy 'B'
No właśnie – oczekujemy ‚B’, a wyświetli się… ‚A’. Niefajnie, prawda? Nie ufajmy więc domyślnym wartościom funkcji i piszmy:
class A {} class B extends A { function printParent() { echo get_parent_class($this); } } class C extends B {} $obj = new C(); echo $obj->printParent(); // dostajemy 'B'
Można podejrzewać, że get_parent_class() wywołane bez parametrów pracuje nie tyle na bieżącym obiekcie, co nazwie klasy, w której została zdeklarowana wywoływana metoda. Takie – dość dziwne zachowanie – nie jest wyjątkiem w PHP. Podobnie działa get_class(), prawdopodobnie też kilka innych. Zostaliście ostrzeżeni.