Ich möchte besser verstehen, warum es im folgenden Szenario einen Unterschied in der Art und Weise gibt, wie Klassenkonstanten gegenüber Instanzvariablen vererbt werden.
<?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();
Ausgabe:
TWO
TWO
ONE
TWO
Im obigen Code verfügt ChildClass nicht über eine showTest () -Methode, daher wird die ParentClass showTest () -Methode bei der Vererbung verwendet. Die Ergebnisse zeigen, dass, da die Methode auf der ParentClass ausgeführt wird, die ParentClass-Version der TEST-Konstante ausgewertet wird, während die ChildClass-Mitgliedsvariable $ test ausgewertet wird, da sie im ChildClass-Kontext über die Vererbung ausgewertet wird.
Ich habe die Dokumentation gelesen, kann aber anscheinend keine Erwähnung dieser Nuance sehen. Kann jemand etwas Licht für mich bringen?
php
oop
inheritance
overriding
constants
Tom Auger
quelle
quelle
final
...Antworten:
self::
Ist nicht vererbungsbewusst und bezieht sich immer auf die Klasse, in der es ausgeführt wird. Wenn Sie php5.3 + verwenden, können Sie versuchen,static::TEST
wie vererbungsbewusststatic::
.Der Unterschied besteht darin, dass
static::
"späte statische Bindung" verwendet wird. Weitere Informationen finden Sie hier:http://php.net/manual/en/language.oop5.late-static-bindings.php
Hier ist ein einfaches Testskript, das ich geschrieben habe:
Ausgabe
quelle
static::
.test()
es sich nicht um eine statische Methode handelt, warum nicht$this::TEST
mit PHP5.3 + verwenden?self::
/static::
Unterschied, aber ich verstehe nicht, warum ichstatic::
statt$this::
(nichtself::
) benutze . Gibt es einen Unterschied zwischen$this::
undstatic::
(da es einen zwischenstatic::
/$this::
und gibtself::
)?In PHP bezieht sich self auf die Klasse, in der die aufgerufene Methode oder Eigenschaft definiert ist. Also in Ihrem Fall Sie anrufen
self
inChildClass
, so dass es die Variable aus dieser Klasse verwendet. Dann verwenden Sieself
inParentClass
, sodass es sich dann auf die Variable in dieser Klasse bezieht.Wenn Sie weiterhin möchten, dass die untergeordnete Klasse
const
die übergeordnete Klasse überschreibt , passen Sie den folgenden Code in Ihrer übergeordneten Klasse daran an:Beachten Sie das
static
Schlüsselwort. Dies verwendet "späte statische Bindung". Jetzt ruft Ihre Elternklasse die Konstante Ihrer Kinderklasse auf.quelle