get_parent_class(), czyli pułapki dziedziczenia w PHP

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.

Dodaj komentarz

Twój adres e-mail nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *

Możesz użyć następujących tagów oraz atrybutów HTML-a: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>