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 ?

Était-ce utile?

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
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top