Überschreiben von Klassenkonstanten gegenüber Eigenschaften
Lesezeit: 3 Minuten
Tom Auger
Ich würde gerne 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 hat ChildClass keine Methode showTest(), daher wird die Methode ParentClass showTest() durch 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 innerhalb des ChildClass-Kontexts über Vererbung ausgewertet wird.
Ich habe die Dokumentation gelesen, kann aber anscheinend keine Erwähnung dieser Nuance sehen. Kann mir jemand Licht ins Dunkel bringen?
WTF? Ständiges Übersteuern!? Mach das nicht! noch nie!
– qwert_ukg
20. September 2016 um 2:17 Uhr
@qwert_ukg In der Tat. Jemand sollte das den Entwicklern von PHP mitteilen. Oder zumindest zulassen final…
– Lukas Sawczak
18. August 2017 um 1:18 Uhr
Es gibt sicher gute Anwendungsfälle, selbst für ständiges Überschreiben :]
– Lukáš Klíma
7. Februar 2020 um 7:33 Uhr
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 es versuchen static::TEST wie static:: ist vererbungsbewusst.
Der Unterschied ist das static:: verwendet “späte statische Bindung”. Weitere Informationen finden Sie hier:
Hier ist ein einfaches Testskript, das ich geschrieben habe:
<?php
class One
{
const TEST = "test1";
function test() { echo static::TEST; }
}
class Two extends One
{
const TEST = "test2";
}
$c = new Two();
$c->test();
Ausgang
test2
+ für die Erwähnung static::.
– Jason McCreary
28. November 2012 um 20:23 Uhr
Genial. Vielen Dank für die Klarstellung und für die Bereitstellung der zusätzlichen Informationen zu späten statischen Bindungen (die ich noch verdauen muss).
– Tom Auger
29. November 2012 um 14:41 Uhr
Seit test() ist keine statische Methode, warum nicht verwenden $this::TEST mit PHP5.3+?
– Xenos
24. Juni 2014 um 13:05 Uhr
Hallo @Xenos – Das Ziel des Beispiels war es zu zeigen, dass Code auf Instanzebene, der in Klasse Eins ausgeführt wird, statische Werte aus Klasse Zwei abruft. self::TEST hätte “test1” zurückgegeben, während static::TEST das erwartete “test2” zurückgibt – Hoffe, das hilft, danke für die Antwort!
– David Farell
26. Juni 2014 um 1:45 Uhr
Hallo @DavidFarrell – Ja, ich habe die self:: / static:: Unterschied, aber ich verstehe nicht, warum mit static:: Anstatt von $this:: (nicht self::). Gibt es einen Unterschied zw $this:: und static:: (da es einen dazwischen gibt static::/$this:: und self::)?
– Xenos
29. Juni 2014 um 12:29 Uhr
In PHP bezieht sich self auf die Klasse, in der die aufgerufene Methode oder Eigenschaft definiert ist. In Ihrem Fall rufen Sie also an self in ChildClass, also verwendet es die Variable aus dieser Klasse. Dann benutzt du self in ParentClassalso wird es sich dann auf die Variable in dieser Klasse beziehen.
wenn Sie immer noch möchten, dass die untergeordnete Klasse die überschreibt const der übergeordneten Klasse, dann passen Sie den folgenden Code in Ihrer übergeordneten Klasse an diese an:
public function showTest(){
echo static::TEST;
echo $this->test;
}
Beachten Sie das static Stichwort. Dies verwendet “spätes statisches Binden”. Jetzt ruft Ihre übergeordnete Klasse die Konstante Ihrer untergeordneten Klasse auf.
Profi. static:: Job in Abstraktion statt self::
– Błażej Krzakala
7. November 2018 um 9:58 Uhr
13577700cookie-checkÜberschreiben von Klassenkonstanten gegenüber Eigenschaftenyes
WTF? Ständiges Übersteuern!? Mach das nicht! noch nie!
– qwert_ukg
20. September 2016 um 2:17 Uhr
@qwert_ukg In der Tat. Jemand sollte das den Entwicklern von PHP mitteilen. Oder zumindest zulassen
final
…– Lukas Sawczak
18. August 2017 um 1:18 Uhr
Es gibt sicher gute Anwendungsfälle, selbst für ständiges Überschreiben :]
– Lukáš Klíma
7. Februar 2020 um 7:33 Uhr