2010-08-02 4 views
1

J'ai la configuration suivante:Accès variable statique de la classe Enfant-> php enfant

<?php 
class core { 
    static $var1; 
} 

class parent extends core { 
    function getStatic() { 
     return parent::$var1; 
    } 
} 

class child extends parent { 
    function getStatic() { 
     // I want to access core static var, how can i do it? 
     //return parent::$var1; 
    } 
} 
?> 

Je dois pouvoir utiliser parent :: var1 $, mais à l'intérieur de la classe enfant .. est-ce possible? Est-ce que je manque quelque chose?

Répondre

4

référence Juste comme moi ... PHP va automatiquement la chaîne d'héritage jusqu'à ce qu'il trouve un match

class core { 
    protected static $var1 = 'foo'; 
} 
class foo extends core { 
    public static function getStatic() { 
     return self::$var1; 
    } 
} 
class bar extends foo { 
    public static function getStatic() { 
     return self::$var1; 
    } 
} 

Maintenant, il y aura un problème si vous ne déclarez pas getStatic dans la barre. Prenons un exemple:

class foo1 extends core { 
    protected static $var1 = 'bar'; 
    public static function getStatic() { 
     return self::$var1; 
    } 
} 
class bar1 extends foo1 { 
    protected static $var1 = 'baz'; 
} 

Maintenant, vous attendez foo1::getStatic() retourner bar (et il). Mais que va retourner Bar1::getStatic()? Il renverra également bar. C'est ce qu'on appelle la liaison statique tardive. Si vous voulez le retourner baz, vous devez utiliser static::$var1 au lieu de self::$var1 (PHP 5.3+ seulement) ...

1

Le plus gros problème ici est que vous utilisez le mot-clé parent comme nom de classe. Cela rend complètement ambigu si vos appels à parent :: $ var1 sont destinés à pointer vers cette classe ou vers le parent de la classe appelante. Je crois que si vous nettoyez cela, vous pouvez réaliser ce que vous voulez. Ce code imprime 'quelque chose', par exemple.

class core { 
    static $var1 = 'something'; 
} 

class foo extends core { 
    function getStatic() { 
     return parent::$var1; 
    } 
} 

class bar extends foo { 
    function getStatic() { 
     // I want to access core static var, how can i do it? 
     return parent::$var1; 
    } 
} 

$b = new bar(); 
echo $b->getStatic(); 

Il fonctionne également si vous utilisez core:: au lieu de parent::. Ces deux auront un comportement différent si vous déclarez un $ var1 statique à l'intérieur de la classe foo. Comme c'est une seule variable héritée.

+0

Je vais vérifier cela, BTW, Ce n'est pas réellement appelé 'parent' qui est juste un mauvais exemple. – Lizard

+0

'parent' est un mot-clé réservé, PHP ne vous laissera pas appeler votre classe' parent'. – NullUserException

2

core :: $ var1 semble le mieux à vos besoins ...

+0

Je l'ai surclassé, mais je n'ai plus de voix. – NullUserException

Questions connexes