2017-04-03 90 views
-1

說,例如我有兩個類AB類屬性是否在擴展類上被覆蓋?

答:

class A { 
    private $name = "Joe"; 
} 

B:

class B extends A { 
     private $name = "Scotto"; 
} 

會有什麼的$name的價值是什麼?它是否覆蓋父類屬性,或者它會在實例中被實例化嗎?任何幫助將是偉大的,謝謝!

+0

@naththedeveloper我可以很容易地嘗試,但我正在尋找一個更深入的答案不僅僅是「哇,好,這就是它」 –

+0

爲什麼會被替換?私有意味着只有這個類可以訪問這個屬性。因此,每個類都有自己的'$ name'定義。 [Clicky](https://eval.in/private/830e62ffefe9ab) –

+0

但是,當'$ name'被定義爲'protected'或'public'時,它確實被'Scotto'取代。我建議閱讀[文檔](http://php.net/manual/en/language.oop5.visibility.php)瞭解可見性。它在示例代碼中聲明:「我們可以重新聲明公共和受保護的屬性,但不是私有的」。 –

回答

1

我會建議在文檔頁面上特別閱讀this comment。重點在於方法,但屬性相同

...私有方法只對定義它們的類可見,而子類不會看到父級的私有方法。如果孩子沒有看到父母的私人方法,孩子不能覆蓋他們。

你舉的例子:

class A { 
    private $name = "Joe"; 

    public function getName() { 
    return $this->name; 
    } 
} 

class B extends A { 
    private $name = "Scotto"; 
} 

class C extends A { 
    private $name = "Scotto"; 

    public function getName() { 
    return $this->name; 
    } 
} 

$a = new A; 
$b = new B; 
$c = new C; 

$a->getName(); // 'Joe' 
$b->getName(); // 'Joe' 
$c->getName(); // 'Scotto'