2011-07-30 113 views
1

我無法理解爲什麼我可以從我的父類訪問屬性,但它是NULL,即使它已由父級設置(並且已沒有被明確地重置)。我認爲這可能是因爲該財產是由私人方法設定的,但當我改爲公開時​​沒有什麼不同。下面是一個從根本上簡化例如:從父方法設置的父類屬性空白從子方法訪問時

​​

我工作圍繞這個由父母轉移的財產,以當孩子由父母構造即new TheChild($this->_parent_property)的孩子,但我還是不明白,爲什麼$此 - > _ parent_property是在我的原始示例中從子項訪問時設置爲NULL。

我知道如果我從父構造函數中設置這個屬性,我可以很好地訪問它。我試圖理解爲什麼一個由父方法設置的屬性,以及其他父方法可訪問的屬性不能從擴展父類的子類訪問。

任何人都可以解釋一下嗎?謝謝!

回答

2

問題是您正在創建一個未設置變量的新實例。該屬性綁定到一個特定的實例,所以你創建的父母的一個實例,然後從父母的另一個孩子的實例,其中包括所有的東西創建一個新的父母將包含,其中包括$_parent_property。當您讀取孩子的值時,您正在讀取新創建的父代的值,而不是您之前創建的值。

實際上,你這樣做:

A = new TheParent() 
A->_parent_property = 'test' 
Calls: 
    B = new TheChild(), underneath the covers, this does new TheParent() 
    Print B->_parent_property (which was uninitialized) 

考慮將產生你預期的結果這個類似的例子:

class TheParent 
{ 

    protected $_parent_property; 

    function __construct() 
    { 
     parent_method(); 
    } 

    private function parent_method(); 
    { 
     $this->_parent_property = 'test'; 
    } 
} 

class TheChild extends TheParent 
{ 
    function __construct() 
    { 
     parent::construct(); 
    } 

    public function child_method(); 
    { 
     echo $this->_parent_property; 
     exit; 
    } 
} 

$child = new TheChild(); 
$child->child_method(); 

在這個例子中,在TheParent私有方法被調用同一由TheChild創建的實例,設置基礎實例變量。

+0

感謝您的迴應,馬克。我剛剛更新了我的示例,以顯示在調用父方法時傳遞父屬性的值。基於你的回答,我想如果不先將它傳遞給子類,那麼不可能在屬性中保留原始參數值? –

+1

@Calvin:你的關係是向後的,'TheChild'從'TheParent'繼承,如果你想'TheChild'擴展'TheParent',你應該把setter方法暴露給'TheChild',或者移除繼承關係並且傳遞一個實例'TheParent'到'TheChild'(或者你需要的變量) –

+0

它們被稱爲靜態變量。爲什麼'TheParent'實例化TheChild? –

1

對繼承的工作原理你有一點點錯誤的想法。

TheParent是一類,而TheChild是基於TheParent的一類。 $test現在是TheParent的一個實例。根據TheParent的類別,我們不知道還有另一個類別TheChild

您將創建一個新實例$call,該類型的類型爲TheChild。這是,用另一個詞,一個新的對象。它與$test無關,只是它們與TheParent「兼容」。

TheChild$call)從其父級(類)繼承屬性_parent_property。但是,該屬性未在該實例(對象)中初始化/設置,因此它仍然是NULL

+0

是的,馬克的回答有助於澄清這一點。無論如何,我爲你抽出寶貴時間閱讀和回覆。謝謝=) –