poniedziałek, 1 października 2012

Dlaczego nie PHP - $this w metodach statycznych (odc. 4)

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.

<?php

class A 
{
    public function test()
    {                                                                                                  
        return B::test();
    }
}

class B
{
    public function test()
    {
        return get_class($this);
    }
}

$obj = new A();
echo $obj->test();

?> 
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!?

<?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

Brak komentarzy:

Prześlij komentarz