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!
Это один из основы наследования, поскольку он относится к 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
; он может действовать только на $_list
через публичные функции, определенные в ListOfThings
.
Просмотрите страницу Visibility в документации PHP для получения более подробной информации о таких вещах.
'foo()' не будет скопирован, он унаследован родителем 'A'. Я не понимаю вашу конкретную проблему. Конечно, это терпит неудачу, потому что вы сделали свой метод 'foo' в' C' частным. Сделайте его общедоступным, и он будет работать. –
Каким образом foo наследуется? ... так как это частный метод ... это пример из руководства php –
Да, это просто не доступно. –