2013-07-19 37 views
1

我可以發誓,在標準的OOP中,您可以從基類中的方法訪問具體類的私有成員。 PHP是否僅僅以不同的方式實現,或者我做錯了什麼,或者我的理解完全錯誤?基類不允許訪問私有成員?

<?php 

class Base { 
    public function __toString() { 
    return $this->name; 
    } 
} 

class Concrete extends Base { 
    private $name; 

    public function __construct($name) { 
    $this->name = $name; 
    } 
} 

$o = new Concrete('foobar'); 
echo $o; 

上述代碼片段拋出Fatal error: Cannot access private property Concrete::$name on line 5。如果我將$name的訪問級別更改爲protected,它將起作用。

Demo

+3

如果擴展Base並且不在子類中引入屬性'$ name',該怎麼辦?基類不能依賴於子類! – Niko

+0

沒有什麼叫做「標準」OOP;每種語言都有它自己的味道。然而,我想不出任何語言,我希望在我的頭頂上工作...... – Stobor

+1

你想在這裏做什麼?我聽說過Control_的_Inversion,但是我從來沒有聽說過_Inversion of Inheritance _... –

回答

3

私人通常意味着它只能從課堂內部訪問。我認爲這是預期的行爲。

從PHP-文檔:

的屬性或方法的可見性可以通過在前面與公衆的關鍵字聲明來定義,保護或私有。宣佈公開的類成員可以隨處訪問。聲明保護的成員只能在類本身以及繼承類和父類中訪問。 聲明爲private的成員只能由定義該成員的類訪問。

1

這正是private和protected的區別。只有我可以看到私有變量,但我的家人可以看到受保護的。

2

準確地說,私人是完全私人的(我的日常日記),甚至家人不能訪問。受保護的車輛只能從世界其他地方得到保護(我的車),但家人可以進入。