W języku PHP widziałem już kilka dziwnych zjawisk. Jednak to na co natknąłem się niedawno, powaliło mnie zupełnie na kolana. PHP w momencie gdy nie ma ustawionego poziomu raportowania błędów na "strict" pozwala na wywoływanie metod, które nie są zadeklarowane jako statyczne przy użyciu operatora :: oraz odwrotnie - metody statyczne można wywoływać w kontekście obiektu poprzez $this. Dla przykładu przedstawię kod.
Zazwyczaj takie działania w innych językach powodują błędy. W PHP, które nie jest ustawione na "strict" wykona powyższy kod. Co ciekawe wynik będzie dosyć zaskakujący. Na logikę w kontekście statycznym odwołanie $this w metodzie B::test() nie powinno istnieć. W PHP istnieje a powyższy kod wypisze, że w metodzie B::test() odwołanie $this jest do obiektu klasy A. Po dopisaniu do metody B::test() deklaratora, iż metoda jest statyczna (jak poniżej) zupełnie zmienia zachowanie skrytpu. No i wreszcie w B::test() odwołanie $this jest klasy B - tylko dlaczego istnieje!?
Powyższa lekcja pokazuje, że języka PHP chyba nigdy nie przestanę się uczyć - a on sam nie przestanie mnie zaskakiwać. Powyższy artykuł napisano na podstawie wersji 5.3.x.
Artykuł udostępniany na licencji CC-BY-SA-3.0
<?php
class A
{
public function test()
{
return B::test();
}
}
class B
{
public function test()
{
return get_class($this);
}
}
$obj = new A();
echo $obj->test();
?>
<?php
class A
{
public function test()
{
return B::test();
}
}
class B
{
public static function test()
{
return get_class($this);
}
}
$obj = new A();
echo $obj->test();
?>
Powyższa lekcja pokazuje, że języka PHP chyba nigdy nie przestanę się uczyć - a on sam nie przestanie mnie zaskakiwać. Powyższy artykuł napisano na podstawie wersji 5.3.x.
Artykuł udostępniany na licencji CC-BY-SA-3.0
Komentarze
Prześlij komentarz