2009-02-03 63 views
1

我試圖通過沒有實例化的父類訪問子類中的成員變量。從沒有實例的超類訪問子變量

這是我的一次嘗試,但B::getStatic()Access to undeclared static property而失敗。

是否有另一種解決方案,可能沒有靜態?

class A { 

    static public function getStatic() { 

     return self::$myStatic; 

    } 

} 

class B extends A { 

    public static $myStatic = 5; 

} 

class C extends A { 

    public static $myStatic = 6; 

} 

var_dump(B::$myStatic); 
var_dump(B::getStatic()); 

var_dump(C::$myStatic); 
var_dump(C::getStatic()); 
+0

沒有你試着將A的躁動看成某種價值,看看會出現什麼? – cbrulak 2009-02-03 23:30:57

+0

是的。它引用A中的靜態,只是不在B中。我明白爲什麼這是一個問題,因爲A可能無法識別B的靜態。我問是否有另一種方式來做到這一點? – 2009-02-03 23:34:23

+0

哈哈大家都被壓低了! – 2009-02-03 23:49:09

回答

2

您遇到的概念稱爲「後期靜態綁定」。在PHP 5.3.0之前,並沒有對此提供支持。

如果你正在運行5.3.0或更高,更新getStatic()方法:

靜態公共功能getStatic(){

return static::$myStatic; 

}

-1

$myStatic必須聲明A類靜態:見here

0

函數聲明和變量聲明不匹配。

要麼你需要移動函數的聲明到B

動議變量的聲明到A.

0

B類繼承類A中的屬性,而不是相反的。

爲什麼你不使用B::$myStatic就像你的例子?

-1
class A { 
    public static $myStatic = 5; 
}  
class B extends A { 
    public static $myStatic = 3; 
} 
class C extends A { 
    public static $myStatic = 1; 
} 

就用B :: $ myStatic ...

0

你必須myStatic進入A.你的方法getStatic在A不能訪問不答

存在的變量
0

PHP manual:當前類 像self::__CLASS__

靜態引用解析 我們荷蘭國際集團在該函數 所屬的類,在它被定義爲:

所以,因爲該方法是在,當你在BC調用它getStatic()定義試圖返回a::$myStatic,這沒有按」不存在。即使它確實存在,你也只能得到這個值,而不是子類中的任何重載值。

一個解決方案是延遲靜態綁定,但只有PHP 5.3尚未發佈。

1

其他是正確的,你的代碼的方式是無法完成的,因爲該變量在編譯時不存在。

做這樣的事情的方式通常是抽象類(PHP5中可用,看起來像)。

A類將是抽象類,並將有一個getStatic()函數。 B和C類將擴展A並具有getStatic()函數的定義。這樣,當你調用getStatic()時,你將得到子類定義的值,因爲在A中沒有定義。

這種方法的缺陷是你不能實例化A,因爲它是抽象的。您總是必須製作一個B或C(或其子類)。

您也可以在A中創建一個setter,並讓子類使用它來設置值(而不是'='s)。這將讓你實例化A,並且它可以設置它的值,如果它需要的話。您可能能夠將setter設置爲private,因此不能直接調用它,我不知道子類是否可以在PHP中使用私有函數。