11
votes

Héritage de classe dans PHP 5.2: Variable statique primordial en classe d'extension?

J'ai besoin de Bea pour pouvoir utiliser une variable statique définie dans une classe qui étend une classe de base ... de la classe de base.

Considérez ceci: P>

class Animal {
    public static $color = 'black';

    public static function get_color()
    {
        return self::$color;
    }
}

class Dog extends Animal {
    public static $color = 'brown';
}

echo Animal::get_color(); // prints 'black'
echo Dog::get_color(); // also prints 'black'


3 commentaires

Je suppose que chien devrait prolonger animal ?


Avec l'explication ultérieure, je pense que vous devriez mettre votre recherche / trouver par des fonctions comme méthodes sur une classe de table plutôt que sur la statique sur une classe de lignes (ce que cela ressemble à être comme vous essayez


GNARF: Oui, c'est ce que je suis venu avec la fin de la nuit dernière. Ce n'est pas aussi joli mais ça va faire.


3 Réponses :


2
votes

Malheureusement, avant PHP 5.3, il n'y a aucun moyen de simuler une reliure statique tardive. La seule façon dont vous pouvez obtenir l'héritage de fonctionner au fur et à mesure de votre intention, c'est si ce sont des variables et des méthodes d'instance.


2 commentaires

Ce qui signifie que je ne peux pas utiliser des méthodes statiques pour créer eux-mêmes les objets eux-mêmes?


Non si vous comptez sur des données statiques stockées dans des sous-classes, non.



9
votes

J'ai rencontré ce problème lors de la sous-classement quelque chose dans le cadre Zend. Ma détermination était que dans des terres purement statiques, vous n'avez qu'une seule option ... redéfinir la fonction dans la classe héritante: xxx

si vous pouvez créer des instances - vous pouvez utiliser get_class ($ this) Pour savoir la classe d'appel, par exemple: xxx

La seule autre option que j'ai pensé à utiliser un paramètre de fonction à la fonction statique Pour définir une classe, elle était appelée. Il peut être par défaut à __ classe __ et ensuite vous pouvez retour parent :: get_class ($ classe) de la sous-classe. Un modèle comme celui-ci pourrait être utilisé pour faciliter la réutilisation de la fonction statique (car je doute que le retour d'une propriété publicitaire statique est la seule chose que vous essayez d'utiliser auto :: pour dans cette méthode statique: xxx


1 commentaires

Merci pour votre réponse. Cela fonctionne dans l'exemple que j'ai fourni, mais le cas réel est un peu plus compliqué. Je modifie mon message pour vous dire ce que je veux réellement faire et, espérons-le, il pourrait y avoir des angles très différents que ceux que j'ai essayés.



5
votes

dans PHP 5.3+, ce qui suit serait préféré: xxx

fixations statiques tardifs (php.net)


0 commentaires