Pourquoi la liaison statique tardive ne fonctionne-t-elle pas avec les variables dans PHP 5.3 ?
-
13-11-2019 - |
Question
Commençons par un peu de code :
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();
Désormais, la liaison statique tardive dans PHP 5.3 à l'aide du statique Le mot-clé fonctionne très bien avec les méthodes statiques, j'ai donc supposé qu'il ferait la même magie sur les variables statiques.Eh bien, il semble que ce ne soit pas le cas.L'exemple ci-dessus n'imprime pas "rouge" puis "vert" comme je m'y attendais au départ, mais "vert" et "vert".Pourquoi cela ne fonctionne-t-il pas sur les variables alors que cela fonctionne sur les méthodes ?Existe-t-il un autre moyen d'obtenir l'effet que j'attendais ?
La solution
La liaison statique tardive ne fonctionnera que pour les nouvelles définitions de variables/méthodes.Ainsi, dans votre exemple, le $color
propriété de Super
sera toujours modifié au lieu de ChildA
ou ChildB
.Pour utiliser la liaison statique tardive, vous devez utiliser le static
mot-clé au lieu de self
.De plus, vous devez redéfinir le $color
propriété de votre ChildA
et ChildB
Des classes:
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