it-swarm.com.de

Überschreiben von Klassenkonstanten gegen Eigenschaften

Ich möchte besser verstehen, warum es im folgenden Szenario einen Unterschied zwischen der Vererbung von Klassenkonstanten und Instanzvariablen gibt.

<?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 showTest () -Methode von ParentClass bei der Vererbung verwendet. Die Ergebnisse zeigen, dass die ParentClass-Version der TEST-Konstante ausgewertet wird, da die Methode für die ParentClass ausgeführt wird, während die ChildClass-Mitgliedsvariable $ test ausgewertet wird, da sie über die Vererbung im ChildClass-Kontext ausgewertet wird.

Ich habe die Dokumentation gelesen, kann aber anscheinend keine Erwähnung dieser Nuance feststellen. Kann jemand etwas Licht für mich bringen?

88
Tom Auger

self:: Ist nicht vererbungsfähig und bezieht sich immer auf die Klasse, in der es ausgeführt wird. Wenn Sie PHP 5.3 + verwenden, können Sie static::TEST wie static:: ist vererbungsfähig.

Der Unterschied ist, dass static:: verwendet "late static binding". 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();

Ausgabe

test2
175
David Farrell

In PHP bezieht sich self auf die Klasse, in der die aufgerufene Methode oder Eigenschaft definiert ist. In Ihrem Fall rufen Sie also self in ChildClass auf, sodass die Variable dieser Klasse verwendet wird. Dann benutzen Sie self in ParentClass, so dass es dann auf die Variable in dieser Klasse verweist.

wenn die untergeordnete Klasse weiterhin das const der übergeordneten Klasse überschreiben soll, passen Sie den folgenden Code in Ihrer übergeordneten Klasse an:

public function showTest(){
    echo static::TEST;
    echo $this->test;
}

Beachten Sie das Schlüsselwort static. Dies verwendet die "späte statische Bindung". Jetzt ruft Ihre übergeordnete Klasse die const Ihrer untergeordneten Klasse auf.

14
w00