PHP 5.3: liaison statique tardive ne fonctionne pas pour les propriétés lorsqu'elle est définie dans la classe mère tout en manquant dans la classe des enfants

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

Question

Jetez un oeil à cet exemple, et notez les résultats indiqués.

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

?>

Je crois comprendre que l'utilisation du statique mot-clé serait référence à la classe des enfants, mais apparemment il applique par magie à la classe parente chaque fois qu'il est absent de la classe enfant. (Ce type est d'un comportement dangereux pour PHP, plus ce expliqué ci-dessous.)

Je pense les deux choses suivantes pour lesquelles je veux faire ceci:

  1. Je ne veux pas la redondance de définir toutes les propriétés dans toutes les classes d'enfants.
  2. Je veux des propriétés à définir par défaut dans la classe parente et je veux la définition de classe des enfants pour être en mesure de passer outre ces propriétés chaque fois que nécessaire. Les besoins de la classe des enfants à exclure des propriétés à chaque fois que les paramètres par défaut sont destinés, ce qui est la raison pour laquelle je ne définit pas les propriétés dans les classes d'enfants dans l'exemple ci-dessus.

Cependant, si nous voulions passer outre une propriété à l'exécution (via la méthode d'initialisation), il remplace pour la classe parente! A partir de ce moment, les classes d'enfants initialisés plus tôt (comme dans le cas du frère) change de façon inattendue sur vous.

Apparemment, cela est le résultat de classes d'enfants de ne pas avoir leur propre copie de la propriété statique chaque fois qu'il est pas explicitement définie à l'intérieur de la classe des enfants - mais au lieu de lancer un comportement erreur, il passe de statique pour accéder au parent. Par conséquent, est-il possible que la classe parent pourrait créer dynamiquement une propriété qui appartient à la classe des enfants sans elle apparaît à l'intérieur de la définition de la classe enfant? De cette façon, la classe enfant pourrait avoir sa propre copie du propriété statique et le mot-clé statique peut s'y référer correctement, et il peut être écrit à prendre en compte les valeurs par défaut de propriété parent.

Ou est-il une autre solution, bon, mauvais ou laid?

Était-ce utile?

La solution

Il ne se réfère à la classe correcte, il est juste que, à moins redéclaré ou autrement l'ensemble de référence est cassé, les propriétés statiques des sous-classes sont dans le même ensemble de référence que dans la superclasse.

Vous devez faire:

class Brother extends Mommy
{
    protected static $_data;
}

ou

class Brother extends Mommy
{
}

$tmp = null;
Brother::$_data =& $tmp;
unset($tmp);
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top