7

让我们从一些代码开始:

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关键字的后期静态绑定非常适用于静态方法,所以我认为它会对静态变量产生同样的魔力。嗯,好像没有。上面的示例并没有像我最初预期的那样打印出“red”然后是“green”,而是打印出“green”和“green”。当它适用于方法时,为什么这不适用于变量?有没有其他方法可以达到我预期的效果?

4

1 回答 1

13

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

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
于 2011-05-14T07:29:14.963 回答