foo
B 自体にはコピーされません (継承されますが、表示されません。以下のゴードンのコメントを参照してください)。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!
これは、情報の隠蔽/カプセル化に関連する継承の基本の 1 つです。これにより、次のようなことができます。
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 ドキュメントの可視性ページを確認してください。