2010-08-20 94 views
2

我有一個關於輸出顯示方式的問題。私有/公共變量的PHP和繼承

<?php 

class Base 
{ 
    private $privattrib = "Private Attribute1"; 

    function GetAttrib() 
    { 
     echo $this->privattrib; 
    } 
} 

class Derived extends Base 
{ 
    private $privattrib = "bute"; 
    function GetAttrib() 
    { 
     parent::GetAttrib();  
    } 
} 

$b = new Base(); 
$d = new Derived(); 
$d->GetAttrib(); 

>

因此,對於上面的代碼,我有幾個問題:?

  1. 當我打電話父:: GetAttrib(),做的$ this的值(在Base的GetAttrib()方法)現在成爲一個Base對象,還是它仍然是一個Derived對象?

  2. 輸出是「Private Attribute1」。如果$ this引用了一個Derived對象,那麼不應該顯示爲「bute」,因爲private屬性在基類中被覆蓋了嗎?

  3. 如果我將兩個私有屬性都更改爲public,則輸出現在是「bute」。爲什麼是這樣?

回答

0

請注意,具有GetAttrib的重寫版本調用基本版本並不是很有用;在Base中將其定義爲undefined將給出相同的結果。

  1. 這是有道理的把它作爲基本類型的對象,因爲你不能調用派生那些只定義的函數,如果任何私有成員變量在這兩個定義,它會使用基地的那些。

  2. 否;由於$ privattrib是私有的,因此Base的版本和Derived的版本是完全獨立的。

  3. 如果你使$ privattrib成員公開,行

    公共$ privattrib = 「弼」;

是$ privattrib的重新定義,而不是新的獨立變量的聲明。

+0

很酷,但你的#1答案與#3沒有衝突嗎?例如,如果這兩個attribs現在都是公共的,並且我運行父方法,它將使用派生類的公共覆蓋屬性。因此,Base對象可以看到Derived成員的屬性。 我只是挑剔嘿。 – Ilya 2010-08-20 08:43:01

+0

我不認爲答案衝突,因爲我小心地指定基本版本僅用於私有成員變量;如果成員變量是公開的,則通過指出您得到的不同行爲來擴展這一點。 – 2010-08-20 12:57:36

0

看來,當你聲明該屬性爲私人它不能被派生類覆蓋。如果你聲明它是公開的,它可以被覆蓋並且被其他代碼直接訪問。我認爲保護意味着它可以被覆蓋,但不能從外部訪問。