foo
不會被複制到B本身(它是繼承的,但不可見;請參閱Gordon的下面的評論)。 B繼承A->foo
,它調用A->test
。爲了演示,看看會發生什麼,當你echo __CLASS__
從test
和foo
內(並刪除static::foo()
通話,這是造成錯誤):
class A {
private function foo() {
echo __CLASS__."->foo\n";
echo "success!\n";
}
public function test() {
echo __CLASS__."->test\n";
$this->foo();
}
}
輸出:
A->test
A->foo
success!
A->test
A->foo
success!
這是一因爲它涉及information hiding/encapsulation繼承基礎。這允許你做這樣的事情:
class ListOfThings {
// internal structure (top secret!)
private $_list = array();
// add item to list
public function add($item) {
$this->_list[] = $item;
}
// return number of items in list
public function count() {
return count($this->_list);
}
}
class ListOfStates extends ListOfThings {
// do we have all 50 states?
public function allStatesListed() {
return $this->count() === 50;
}
// try to access internal structure of ListOfThings
public function accessInternalStructure() {
sort($this->_list);
}
}
$states = new ListOfStates;
$states->add('ME');
$states->add('NH');
$states->add('VT');
$states->add('RI');
$states->add('CT');
var_dump($states->count());
var_dump($states->allStatesListed());
$states->accessInternalStructure();
輸出:
int(5)
bool(false)
Warning: sort() expects parameter 1 to be array, null given...
正如你所看到的,ListOfStates
能夠使用的ListOfThings
所有的公共功能,即使這些功能都依賴於私有變量$_list
。也就是說,ListOfStates
不能直接操作$_list
;它只能通過ListOfThings
中定義的公共功能間接作用於$_list
。
查看PHP文檔中的Visibility頁面以獲取關於此類事情的更多詳細信息。
'foo()'不會被複制,它會被其父'A'繼承。我不明白你的具體問題。當然,它失敗了,因爲你在'C'私有中使你的方法'foo'。將其公開並且會起作用。 –
foo怎麼會被遺傳? ...因爲它是私人的方法...這是從PHP手冊 –
的例子是的,它只是無法訪問。 –