2011-05-14 8 views
6

Vamos a empezar con algo de código:¿Por qué el enlace estático no funciona con las variables en PHP 5.3?

class Super { 

    protected static $color; 

    public static function setColor($color){ 
     self::$color = $color; 
    } 

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

} 

class ChildA extends Super { } 

class ChildB extends Super { } 

ChildA::setColor('red'); 
ChildB::setColor('green'); 

echo ChildA::getColor(); 
echo ChildB::getColor(); 

Ahora, la ligadura dinámica en PHP 5.3 utilizando la estática palabra clave static funciona muy bien con los métodos estáticos, por lo que supuso que haría la misma magia en las variables estáticas. Bueno, parece que no. El ejemplo anterior no imprime "rojo" y luego "verde" como esperaba, sino "verde" y "verde". ¿Por qué esto no funciona en variables cuando funciona en métodos? ¿Hay alguna otra forma de lograr el efecto que esperaba?

Respuesta

11

La vinculación estática tardía solo funcionará para nuevas definiciones de variables/métodos. Por lo tanto, en su ejemplo, la propiedad $color de Super siempre se modificará en lugar de ChildA o ChildB. Para utilizar el enlace estático tardío, debe utilizar la palabra clave static en lugar de self. Por otra parte, es necesario redefinir la propiedad $color de sus ChildA y ChildB clases:

class Super { 

    protected static $color; 

    public static function setColor($color){ 
     // static instead of self 
     static::$color = $color; 
    } 

    public static function getColor() { 
     // static instead of self 
     return static::$color; 
    } 

} 

class ChildA extends Super { 
    protected static $color; 
} 
class ChildB extends Super { 
    protected static $color; 
} 

ChildA::setColor('red'); 
ChildB::setColor('green'); 

echo Super::getColor(); // prints nothing (NULL = ''), expected 
echo ChildA::getColor();// prints red 
echo ChildB::getColor();// prints green 
+0

Muchas gracias, Lekensteyn. Eso arruina un poco la comodidad de la herencia un poco, pero lo haré :) –

+0

Gracias esto realmente ayudó. Caí en la misma trampa; ¡Me faltaba redefinir la variable en las clases para niños! ¿Tiene alguna literatura sobre esto, ya que parecía perder esta pieza vital en los documentos de PHP. – Meberem

Cuestiones relacionadas