Dziwne przypadki programisty – private WTF ?
Posted in php, programowanie on luty 24th, 2011 by Wojciech Soczyński – 10 CommentsWykonując dzisiaj taski w pracy, natrafiłem na ciekawą rzecz, task, z wklejonym komunikatem o treści (imiona klas zostały zmienione ze względu na prośbę zainteresowanych):
Fatal error: Cannot access private property Foo::$foo in /home/www/example/Bar.php on line 75
Pierwsze co zrobiłem, to oczywiście zajrzałem do pliku Bar.php i linie 75, zastałem coś w rodzaju:
public function init(){
$this->foo = 'foofoo';
}
Oczywiście pierwsze co mi przyszło do głowy to „pewnie w klasie w hierarchii wyżej jest ta zmienna zadeklarowana jako private”. Zacząłem przebijać się przez hierarchię klas i ku mojemu zdziwieniu deklaracji „private $foo;” nie znalazłem. Kilka razy rzuciłem kolegę dyżurnym pluszowym krabem i wpadł mi do głowy pomysł – zajrzę do kodu klasy Foo.
Zajrzałem i spostrzegłem, że wywołuje ona parent::init() z klasy Bar. Następnie zauważyłem, że ma zdeklarowane w swoim ciele szukane „private $foo”. Szybko zmieniłem private na protected i zadziałało.
Jakie z tego płyną wnioski ? Po pierwsze, warto czasami rzucić kogoś krabem. Po drugie, kwalifikatory widoczności działają w obie strony hierarchii klas. Po trzecie – jak mówi stare chińskie przysłowie – rzeka płynie tylko w jedną stronę, a jak płynie w dwie to odstaw LSD
.