2011-05-14 54 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

相關問題