Dziwne przypadki programisty – private WTF ?

Wykonują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 ;).

  1. To jest PHP, więc nie można pozwolić sobie na chwilę nieuwagi. Trzeba zawsze być czujnym, zwartym i gotowym do reakcji. ;]

  2. Ha, no ja założę się, że tak samo jest w Javie 😛

  3. Tylko, że w Javie dostaniesz całe drzewo wyjątków wraz ze stack trace’em, a tutaj czasem potrafi się pojawić po prostu biały ekran i jeśli nie wiesz, o co chodzi, to… nie wiesz o co chodzi. ;]

  4. Racja, a swoją drogą, zwykle drzewo wyjątków w J. jest totalnie nieczytelne, więc na jedno wychodzi 😛

  5. Artur Świerc pisze:

    Jeśli pojawia się biały ekran to włącz wyświetlanie błędów 😛

    Stack track w Javie to efekt rozbudowanych bibliotek i zależności, w phpie czegoś takiego nie uświadczymy – mamy na razie ‚biedniej’.

    Tak czy siak, zawszę w Javie czy Phpie patrzę na ostatnie linie stack’a, tam gdzie Ja popełniłem błąd, w importowanych bibliotekach przecież nic nie poprawię :)

  6. @artur czasami mimo włączonego wyświetlania błędów zdarzają się „whitescreen’y”.

    @alan – dobre 😛

  7. Zyx pisze:

    A na jakiej podstawie oczekiwałeś, że to będzie działać? PHP zachowuje się tu jak najbardziej logicznie i poprawnie, a co ciekawsze, komunikat błędu pięknie i elegancko podał Ci, gdzie jest błąd i czyje pole próbujesz odczytać. Co mówi definicja „private”? Że element jest widoczny tylko w kodzie klasy, która go zadeklarowała. Czy kod w klasie Bar jest kodem klasy Foo? Nie jest. Proste.

  8. @zyx, nie o to chodzi. Chodzi o to, że nie spodziewałbym się, że ktoś zadeklaruje zmienną jako „private” w klasie potomnej, podczas gdy w bazowej była zadeklarowana jako public.

  9. Zyx pisze:

    Aaa, no cóż… bywają ludzie złośliwi :).

  1. There are no trackbacks for this post yet.

Leave a Reply

Informuj mnie o odpowiedziach poprzez e-mail. Możesz również subskrybować wpis bez zostawiania komentarza.