poniedziałek, 19 września 2011

self, parent i static

W PHPie istnieją trzy przydatne słowa kluczowe będące referencją do metod oraz atrybutów klas. Wykorzystuje się je przy dziedziczeniu i są to: self, parent, static.

Parent odnosi się do metod/atrybutów klasy bazowej:
<?php
class A {
    public function foo() {
        return 'class A, method foo()';
    }
}
class B extends A{
    public function foo() {
        return 'class B, method foo() and parent: ' . 
                parent::foo();
    }
}
$object = new B;
echo $object->foo();
Powyższy kod dana nam wynik:
class B, method foo() and parent: class A, method foo()

Self odnosi się do metod/atrybutów klasy, które są zdefiniowane w bieżącym kodzie, czyli jeżeli mam klasę A w niej metody foo() i boo(), gdzie chcę, żeby metoda foo() zaimplementowana w klasie A, zawsze odnosiła się do metody boo() z klasy A, nawet jeżeli w klasach potomnych zostanie nadpisana, to właśnie wtedy stosujemy słowo kluczowe self:
<?php
class A {
    public function foo() {
        return self::boo();
    }
    public function boo() {
        return 'A::boo()';
    }
}
class B extends A{
    public function boo() {
        return 'B::boo()';
    }
}
$object = new B;
echo $object->foo();
echo '<br/>';
echo $object->boo();
Wynikiem będzie:
A::boo()
B::boo()

Static odnosi się do metod/atrybutów danej instancji klasy. Najczęściej jest wykorzystywany w metodach statycznych w celu zapewnienia, że wewnątrz zawsze będzie wykonywana metoda z najniższej (ostatniej dziedziczącej) klasy potomnej. Działa tak samo, jak zastosowanie $this w metodach nie statycznych, czyli jeżeli metoda została nadpisana, to zostaje wywołana metoda, która ją nadpisała. W poniższym przykładzie domyślnie wykonywaną metodą jest __construct().
<?php
class A {
    static public function create() {
        return new static;
    }
}
class B extends A{}
$objectA = A::create();
$objectB = B::create();
echo get_class($objectA);
echo '<br/>';
echo get_class($objectB);
Wynik to:
A
B