PHP 5.3: Die späte statische Bindung funktioniert für Eigenschaften nicht, wenn sie in der Elternklasse definiert sind, während sie in der Kinderklasse fehlen

StackOverflow https://stackoverflow.com/questions/4577187

Frage

Schauen Sie sich dieses Beispiel an und beachten Sie die angegebenen Ausgänge.

<?php

class Mommy
{
    protected static $_data = "Mommy Data";

    public static function init( $data )
    {
        static::$_data = $data;
    }

    public static function showData()
    {
        echo static::$_data . "<br>";
    }
}

class Brother extends Mommy
{
}

class Sister extends Mommy
{
}

Brother::init( "Brother Data" );
Sister::init( "Sister Data" );

Brother::showData(); // Outputs: Sister Data
Sister::showData(); // Outputs: Sister Data

?>

Mein Verständnis war, dass die Verwendung des statisch Schlüsselwort würde sich auf die Kinderklasse beziehen, aber anscheinend gilt es auf magische Weise für die Elternklasse, wenn sie in der Kinderklasse fehlt. (Dies ist eine Art gefährliches Verhalten für PHP, mehr dazu, die unten erklärt wurden.)

Ich habe die folgenden zwei Dinge im Sinn, warum ich das tun möchte:

  1. Ich möchte nicht, dass die Redundanz alle Eigenschaften in allen Kinderklassen definiert.
  2. Ich möchte, dass Eigenschaften als Standardeinstellungen in der übergeordneten Klasse definiert werden, und ich möchte, dass die Unterrichtsdefinition von Kindern diese Eigenschaften überschreiben kann, wo immer dies erforderlich ist. Die untergeordnete Klasse muss Eigenschaften ausschließen, wenn die Standardeinstellungen beabsichtigt sind, weshalb ich die Eigenschaften in den untergeordneten Klassen im obigen Beispiel nicht definiere.

Wenn wir jedoch zur Laufzeit eine Eigenschaft außer Kraft setzen möchten (über die Init -Methode), wird sie für die übergeordnete Klasse überschreiben! Von diesem Zeitpunkt an haben sich Kinderklassen früher (wie im Fall von Bruder) unerwartet initialisiert.

Anscheinend ist dies ein Ergebnis von Kinderklassen, die keine eigene Kopie der statischen Eigenschaft haben, wenn sie nicht explizit in der untergeordneten Klasse definiert ist-, aber anstatt einen Fehler zu werfen, wechselt es das Verhalten von statisch Zugriff auf den Elternteil. Deswegen, Gibt es eine Möglichkeit, wie die übergeordnete Klasse eine Eigenschaft dynamisch erstellen könnte, die zur Kinderklasse gehört, ohne dass sie in der Definition der untergeordneten Klassenklasse erscheint? Auf diese Weise könnte die untergeordnete Klasse eine eigene Kopie der statischen Eigenschaft haben, und das statische Schlüsselwort kann sie ordnungsgemäß darauf verweisen, und es kann so geschrieben werden, dass sie die Standardmobilienverlagerung berücksichtigen.

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

War es hilfreich?

Lösung

Es bezieht sich auf die richtige Klasse, es ist nur so, dass die statischen Eigenschaften in Unterklassen in derselben Referenzsätze wie in der Superklasse sind, es sei denn, der Referenzsatz ist unterbrochen.

Also musst du tun:

class Brother extends Mommy
{
    protected static $_data;
}

oder:

class Brother extends Mommy
{
}

$tmp = null;
Brother::$_data =& $tmp;
unset($tmp);
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top