Chciałbym lepiej zrozumieć, dlaczego w poniższym scenariuszu istnieje różnica w sposobie dziedziczenia stałych klas w porównaniu ze zmiennymi instancji.
<?php
class ParentClass {
const TEST = "ONE";
protected $test = "ONE";
public function showTest(){
echo self::TEST;
echo $this->test;
}
}
class ChildClass extends ParentClass {
const TEST = "TWO";
protected $test = "TWO";
public function myTest(){
echo self::TEST;
echo $this->test;
}
}
$child = new ChildClass();
$child->myTest();
$child->showTest();
Wynik:
TWO
TWO
ONE
TWO
W powyższym kodzie ChildClass nie ma metody showTest (), więc metoda ParentClass showTest () jest używana przez dziedziczenie. Wyniki pokazują, że ponieważ metoda jest wykonywana na ParentClass, oceniana jest wersja ParentClass stałej TEST, natomiast ponieważ jest ona oceniana w kontekście ChildClass poprzez dziedziczenie, oceniana jest zmienna składowa ChildClass $ test.
Przeczytałem dokumentację, ale nie widzę żadnej wzmianki o tym niuansie. Czy ktoś może rzucić dla mnie trochę światła?
php
oop
inheritance
overriding
constants
Tom Auger
źródło
źródło
final
...Odpowiedzi:
self::
Nie jest świadomy dziedziczenia i zawsze odwołuje się do klasy, w której jest wykonywany. Jeśli używasz php5.3 +, możesz spróbowaćstatic::TEST
tak, jakstatic::
jest to uwzględniające dziedziczenie.Różnica polega na tym, że
static::
używa się „późnego wiązania statycznego”. Więcej informacji znajdziesz tutaj:http://php.net/manual/en/language.oop5.late-static-bindings.php
Oto prosty skrypt testowy, który napisałem:
wynik
źródło
static::
.test()
nie jest to metoda statyczna, dlaczego nie używać$this::TEST
z PHP5.3 +?self::
/,static::
ale nie rozumiem, dlaczego używamstatic::
zamiast$this::
(nieself::
). Czy istnieje różnica między$this::
istatic::
(ponieważ jest jeden międzystatic::
/$this::
aself::
)?W PHP self oznacza klasę, w której zdefiniowana jest wywoływana metoda lub właściwość. Tak w przypadku, gdy dzwonisz
self
wChildClass
, więc używa zmiennej z tej klasy. Następnie używaszself
inParentClass
, więc będzie odwoływać się do zmiennej w tej klasie.jeśli nadal chcesz, aby klasa podrzędna zastępowała
const
klasę nadrzędną, dostosuj następujący kod w klasie nadrzędnej do tego:Zwróć uwagę na
static
słowo kluczowe. To jest używane „późne wiązanie statyczne”. Twoja klasa nadrzędna będzie teraz wywoływać const klasy podrzędnej.źródło