2009-07-30 12 views
4

Si je déclare une classe de base comme suit:Existe-t-il un moyen d'avoir des sous-classes PHP héritant des propriétés (statique et instance)?

abstract class Parent { 

    protected static $message = "UNTOUCHED"; 

    public static function yeah() { 
     static::$message = "YEAH"; 
    } 
    public static function nope() { 
     static::$message = "NOPE"; 
    } 

    public static function lateStaticDebug() { 
     return(static::$message); 
    } 

} 

puis l'étendre:

class Child extends Parent { 
} 

puis faire:

Parent::yeah(); 
Parent::lateStaticDebug(); // "YEAH" 

Child::nope(); 
Child::lateStaticDebug(); // "NOPE" 

Parent::yeah(); 
Child::lateStaticDebug() // "YEAH" 

Est-il possible d'avoir mon deuxième classe qui hérite de la première hérite également des propriétés et pas seulement des méthodes?

Je me demandais juste s'il y a quelque chose à propos de la liaison statique tardive de PHP et aussi de l'héritage qui permettrait cela. Je suis déjà en train de pirater mon chemin ... Mais cela ne semble pas logique qu'une propriété statique non déclarée retombe sur son parent pour une valeur!?

+0

J'ai créé le bug PHP rapport suivant: http://bugs.php.net/49105 J'encourage les gens à aller vérifier et apporter leur soutien. C'est une limitation assez restrictive. Le comportement actuel est aussi complètement inutile. –

+0

Il semble que les gens se soient résignés au comportement par défaut qui n'est pas intuitif. Le problème ici est soit que PHP a un comportement par défaut incorrect, soit qu'il doit exister un moyen de déclarer dynamiquement les propriétés. –

+0

Je vous soutiens totalement dans votre quête, ce comportement est très énervant! Malheureusement, il semble être là pour rester. – djfm

Répondre

-2

La réponse est "avec une solution de contournement".

Vous devez créer un constructeur statique et le faire appeler pour copier la propriété.

+0

le lien ne fonctionne pas –

+0

Malheureusement, c'était pour mon blog sur blogspot que j'ai pris il y a un certain temps. Je m'excuse. –

+0

Où sont les solutions de contournement? Pourquoi ne pas les poster ici? – txwikinger

1

L'héritage et les propriétés static conduisent parfois à des choses "étranges" en PHP.

Vous devriez jeter un oeil à Late Static Bindings dans le manuel de PHP: il explique ce qui peut arriver lors de l'héritage et en utilisant les propriétés static en PHP < = 5.2; et donne une solution pour PHP> = 5.3 où vous pouvez utiliser les mots-clés static:: au lieu de self::, de sorte que la liaison statique est faite à l'exécution (et non à la compilation).

+1

J'utilise déjà la liaison statique tardive dans mon exemple ... Je suis conscient de ce que c'est. –