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!
这是继承的基础之一,因为它与信息隐藏/封装有关。这使您可以执行以下操作:
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
;它只能$_list
通过中定义的公共功能间接起作用ListOfThings
。
查看PHP 文档中的Visibility页面以获取有关此类内容的更多详细信息。