2011-05-14 52 views
6

让我们先从一些代码:为什么后期静态绑定不能在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(); 

现在,延迟静态使用静态关键字在PHP 5.3结合的伟大工程静态方法,所以我认为它会做同样的神奇静态变量。好吧,看起来没有。上面的例子并没有像我第一次预期的那样打印出“红色”,然后是“绿色”,而是“绿色”和“绿色”。为什么这不适用于变量处理方法?有没有其他方法可以达到我预期的效果?

回答

11

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

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

非常感谢,Lekensteyn。这确实有点遗憾一些继承的舒适一点点,但我会管理:) – 2011-05-14 07:34:51

+0

谢谢这真的帮助。我陷入了同一陷阱;我错过了在子类中重新定义变量!你有没有关于这方面的任何文献,因为我似乎错过了PHP文档中的这个重要部分。 – Meberem 2012-01-15 13:02:11

相关问题