2011-10-03 103 views
1

如果我有一個覆蓋受保護變量的子類,並且父類具有對該變量執行任何操作的函數,那麼如何獲取該函數以使用它被覆蓋的值?父類的方法如何訪問子類的重寫變量?

class Superclass { 
    protected $map; 

    public function echoMap() 
    { 
     foreach ($this->map as $key=>value) 
     { 
      echo "$key:$value"; 
     } 
    } 
} 

class Subclass extends Superclass { 
    protected $map = array('a'=>1, 'b'=>2); 
} 

,當我運行以下

$subclass = new Subclass(); 
$subclass->echoMap(); 

我希望它返回

a:1 
b:2 

$this->map是在父類空的。我應該做些什麼來獲得我想要的行爲?


編輯: 有一個錯誤的構造函數,而不是在上面貼的例子。它按預期工作。

+1

適合我。 - – webbiedave

+0

還有別的事情沒有告訴我們。你給的例子按預期工作。 –

回答

1

PHP確實按照您描述的方式工作。我能看到的唯一的東西就是你的例子,Subclass不會擴展超類。我認爲這只是你的例子中的一個錯誤。檢查以確保所有類實際上都擴展了正確的類,並檢查以確保變量名中沒有拼寫錯誤。

查看http://codepad.viper-7.com/kDrbIh爲它的工作的一個例子。

+0

感謝指出錯字,我修正了它 – rwilson04

+0

如果忘記繼承是問題,那麼他會收到'致命錯誤:調用未定義的方法Subclass :: echoMap'錯誤。 – webbiedave

+0

@webbiedave的權利,因此,「我認爲這只是您的示例中的錯誤」 – mfonda

0

即使它看起來只是一個錯字(不擴展超類),您應該嘗試在兩個類的構造函數中初始化您的變量。

function __construct() { // initialize protected values }

+1

在聲明中初始化它們沒有任何問題。另外,如果他按照你的建議覆蓋構造函數,父類構造函數將不會自動調用。他必須注意調用'parent :: __ construct();' – webbiedave

+0

我實際上是在我的應用程序的構造函數中初始化它們,但是之後我用覆蓋默認值(oops) – rwilson04

+0

@webbiedave覆蓋它,如果php行爲就像Java一樣,超類的默認構造函數應該自動調用http://leepoint.net/notes-java/oop/constructors/constructor.html,但我不知道PHP OOP是否以相同的方式工作 – K2xL

相關問題