PHP 5.3: In ritardo static binding non funziona per le proprietà quando definito nella classe padre mentre manca in classe bambino

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

Domanda

Date un'occhiata a questo esempio, e notare le uscite indicati.

<?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

?>

La mia comprensione è che utilizzando il static parola chiave sarebbe fare riferimento alla classe figlia, ma a quanto pare si applica magicamente alla classe padre ogni volta che manca dalla classe figlia. (Questa è una specie di un comportamento pericoloso per PHP, più su quello spiegato sotto.)

Ho le seguenti due cose in mente per questo che voglio fare questo:

  1. Non voglio che la ridondanza di definire tutte le proprietà in tutte le classi figlie.
  2. Voglio oggetti da essere definiti come valori di default nella classe padre e voglio la definizione della classe bambino di essere in grado di ignorare queste proprietà ovunque sia necessario. Le esigenze di classe bambino di escludere le proprietà ogni volta che i valori di default sono destinati, che è il motivo per cui io non definisco le proprietà delle classi figlie nell'esempio di cui sopra.

Tuttavia, se si vogliono sostituire una proprietà in fase di esecuzione (tramite il metodo init), avrà la precedenza per la classe padre! Da quel punto in avanti, classi figlie inizializzati in precedenza (come nel caso di Brother) inaspettatamente cambiare su di te.

A quanto pare questo è il risultato di classi figlie non avere la propria copia della proprietà statica ogni volta che non è esplicitamente definito all'interno della classe figlia - ma invece di lanciare un errore si passa comportamento di static per accedere al genitore. Pertanto, c'è qualche modo che la classe genitore potrebbe creare dinamicamente una proprietà che appartiene alla classe bambino senza apparire all'interno della definizione di classe bambino? In questo modo la classe bambino potrebbe avere la propria copia del proprietà statica e la parola chiave static possono fare riferimento ad esso correttamente, e può essere scritto per tenere conto genitore default di proprietà.

O c'è qualche altra soluzione, buono, cattivo, o brutto?

È stato utile?

Soluzione

Si fa riferimento alla classe corretta, è solo che, salvo ridichiarato o altrimenti il ??set di riferimento è rotto, proprietà statiche a sottoclassi sono nello stesso insieme di riferimento come nella superclasse.

Quindi è necessario fare:

class Brother extends Mommy
{
    protected static $_data;
}

o

class Brother extends Mommy
{
}

$tmp = null;
Brother::$_data =& $tmp;
unset($tmp);
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top