Überschreiben von Klassenkonstanten gegenüber Eigenschaften

Lesezeit: 3 Minuten

Benutzer-Avatar
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:

http://php.net/manual/en/language.oop5.late-static-bindings.php

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

1357770cookie-checkÜberschreiben von Klassenkonstanten gegenüber Eigenschaften

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy