为什么后期静态绑定不能与PHP 5.3中的变量一起使用?

时间:2011-05-14 07:18:27

标签: php variables inheritance static late-static-binding

让我们从一些代码开始:

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();

现在,PHP 5.3中使用 static 关键字的后期静态绑定对静态方法非常有用,所以我认为它会对静态变量做同样的魔术。好吧,似乎没有。上面的示例不打印出“红色”,然后打印出“绿色”,正如我的预期,但“绿色”和“绿色”。为什么当它适用于方法时,它是否适用于变量?有没有其他方法可以达到我预期的效果?

1 个答案:

答案 0 :(得分:12)

后期静态绑定仅适用于变量/方法的新定义。因此,在您的示例中,$color Super属性始终会被修改,而不是ChildAChildB。要使用后期静态绑定,您需要使用static关键字而不是self。此外,您需要重新定义$colorChildA类的ChildB属性:

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
相关问题