2012-12-16 149 views
-1

我在使用子類靜態方法訪問父級(非靜態)屬性時遇到問題。我已經試過這些如下:如何在靜態方法中訪問父非靜態屬性,在PHP中?

class Parent 
{ 
    protected $nonStatic; 
    // Other methods and properties 
} 

class Child extends Parent 
{ 
    public static function staticFunc() 
    { 
     $test = $this->nonStatic;  # Using $this when not in object context 
     $test = self::$nonStatic;  # Access to undeclared static property 
     $test = parent::$nonStatic # Access to undeclared static property 
    } 
} 

我檢查了計算器類似的問題,但我沒有得到任何有效的解決方案


附:對不起錯別字,和上面的代碼是一個虛擬的例子

+0

代碼,例如,提供,甚至沒有編譯。請確保您提供的代碼實際上以您期望的相同方式失敗。 – Charles

+0

這裏有很多錯誤:不是'protect $ nonStatic;'但是'protected $ nonStatic;','$ this'這個用法在靜態上下文中...... –

+0

那麼如果你從實際代碼中複製並粘貼了上面的代碼,問題是這個'protect $ nonStatic;'它應該是'protected $ nonStatic;'仔細檢查你粘貼的內容。 – PhearOfRayne

回答

1

顯然,靜態方法不會知道非靜態父屬性是什麼。它不知道正在調用哪個對象的實例 - 因此它無法知道該對象是否爲父對象。無論是家長道具設置爲靜態或子對象的實例傳遞給方法,並調用passedChildObject.parentProp

public static function staticFunc(Child c) 
{ 
//should give you passed instance parent prop 
return c.$nonStatic 
} 

現在,當你想要的屬性..

{ 
//assume x is already initialized, this is just for clarity 
Child x; 
returnedProp = x.staticFunc(x) 
} 
+0

謝謝,正如我在問題中所說的評論,我正在改變一個項目設計模式,所以我在這裏問是否可能,然後通過閱讀你的答案我明白我錯在哪裏 – Behzadsh

1

製作父母的財產太靜。 否則在靜態上下文中無法訪問它。

+0

這可能是一個解決方案: )謝謝 – Behzadsh

4

你不能從一個靜態方法訪問父非靜態屬性,因爲這是不可能的定義,是沒有意義的。

非靜態屬性可用的,當你有一個對象實例,而你沒有任何。

相關問題