PHP 5.3: Späte statische Bindung funktioniert nicht für Eigenschaften, wenn sie in der übergeordneten Klasse definiert sind, während sie in der untergeordneten Klasse fehlen

9

Schauen Sie sich dieses Beispiel an und beachten Sie die angezeigten Ausgaben.

%Vor%

Mein Verständnis war, dass sich die Verwendung des statischen -Schlüsselworts auf die Kindklasse beziehen würde, aber anscheinend wird es magisch auf die Elternklasse angewendet, wenn sie in der Kindklasse fehlt. (Dies ist ein gefährliches Verhalten für PHP, mehr zu dem, was weiter unten erklärt wird.)

Ich habe folgende zwei Dinge im Sinn, warum ich das machen möchte:

  1. Ich möchte nicht die Redundanz der Definition aller Eigenschaften in allen untergeordneten Klassen.
  2. Ich möchte, dass Eigenschaften als Standardwerte in der übergeordneten Klasse definiert werden, und ich möchte, dass die untergeordnete Klassendefinition diese Eigenschaften überschreiben kann, wo immer sie benötigt werden. Die untergeordnete Klasse muss Eigenschaften immer dann ausschließen, wenn die Standardeinstellungen beabsichtigt sind. Aus diesem Grund definiere ich die Eigenschaften in den untergeordneten Klassen im obigen Beispiel nicht.

Wenn wir jedoch eine Eigenschaft zur Laufzeit überschreiben möchten (über die init-Methode), wird sie für die Elternklasse überschrieben! Von diesem Punkt an ändern sich Kinderklassen, die früher initialisiert wurden (wie im Falle von Bruder), unerwartet auf dich.

Scheinbar ist dies ein Ergebnis von untergeordneten Klassen, die nicht ihre eigene Kopie der statischen Eigenschaft haben, wenn sie nicht explizit innerhalb der Kindklasse definiert sind - aber anstelle eines Fehlers wird das Verhalten von statisch um auf den Eltern zuzugreifen. Gibt es also eine Möglichkeit, dass die Elternklasse dynamisch eine Eigenschaft erstellen kann, die zu der Kindklasse gehört, ohne dass sie innerhalb der Kindklassendefinition erscheint? Auf diese Weise könnte die Kindklasse ihre eigene Kopie haben Die statische Eigenschaft und das Schlüsselwort "static" können ordnungsgemäß darauf verweisen und geschrieben werden, um die Standardwerte für die übergeordneten Eigenschaften zu berücksichtigen.

Oder gibt es eine andere Lösung, gut, schlecht oder hässlich?

    
OCDev 02.01.2011, 04:51
quelle

1 Antwort

3

Es bezieht sich auf die korrekte Klasse, es ist nur so, dass statische Eigenschaften in Unterklassen im selben Referenzsatz wie in der Oberklasse sind, es sei denn, die neu definierte oder anderweitig die Referenzmenge ist gebrochen.

Sie müssen also tun:

%Vor%

oder:

%Vor%     
Artefacto 02.01.2011, 04:57
quelle