2010-08-02 42 views
1

靜態變量,我有以下設置:訪問從兒童安全>子類PHP

<?php 
class core { 
    static $var1; 
} 

class parent extends core { 
    function getStatic() { 
     return parent::$var1; 
    } 
} 

class child extends parent { 
    function getStatic() { 
     // I want to access core static var, how can i do it? 
     //return parent::$var1; 
    } 
} 
?> 

我需要能夠使用父:: $ VAR1但是從類子內..這可能嗎?我錯過了什麼嗎?

回答

4

只是參考它自我......直到它找到一個匹配

class core { 
    protected static $var1 = 'foo'; 
} 
class foo extends core { 
    public static function getStatic() { 
     return self::$var1; 
    } 
} 
class bar extends foo { 
    public static function getStatic() { 
     return self::$var1; 
    } 
} 

PHP會自動上浮繼承鏈現在,如果你沒有在bar中聲明getStatic,將會有一個問題。讓我們舉個例子:現在

class foo1 extends core { 
    protected static $var1 = 'bar'; 
    public static function getStatic() { 
     return self::$var1; 
    } 
} 
class bar1 extends foo1 { 
    protected static $var1 = 'baz'; 
} 

,你會期望foo1::getStatic()返回bar(將會)。但是Bar1::getStatic()會返回什麼?它也會返回bar。這被稱爲晚期靜態綁定。如果你想要它返回baz,你需要使用static::$var1而不是self::$var1(僅PHP 5.3+)...

1

這裏最大的問題是你使用關鍵字parent作爲類名。這使得您對parent :: $ var1的調用是指向該類還是指向調用類的父類是完全不明確的。

我相信,如果你清理乾淨,你可以達到你想要的。例如,此代碼打印「某物」。

class core { 
    static $var1 = 'something'; 
} 

class foo extends core { 
    function getStatic() { 
     return parent::$var1; 
    } 
} 

class bar extends foo { 
    function getStatic() { 
     // I want to access core static var, how can i do it? 
     return parent::$var1; 
    } 
} 

$b = new bar(); 
echo $b->getStatic(); 

如果使用core::代替parent::它也適用。這兩個的行爲不同,但是,如果您還在foo類中聲明瞭靜態$ var1。就像它是一個單一的繼承變量。

+0

我會檢查出來,順便說一句,它實際上並沒有被稱爲「父」,這只是一個壞例子。 – Lizard 2010-08-02 21:45:31

+0

'parent'是一個保留的關鍵字,PHP不會讓你調用你的類'parent'。 – NullUserException 2010-08-02 21:52:19

2

核心:: $ VAR1似乎最適合您的需求...

+0

我會upvote這個,但我沒有任何投票。 – NullUserException 2010-08-02 21:53:14