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!
Это одна из основ наследования, поскольку она связана с сокрытием информации/инкапсуляция. Это позволяет вам делать такие вещи:
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, чтобы получить более подробную информацию о такие вещи.
person
Jonathan S.
schedule
17.06.2012
foo()
не будет скопирован, он наследуется своим родителемA
. Я не понимаю вашей конкретной проблемы. Конечно, это не удается, потому что вы сделали свой методfoo
вC
закрытым. Сделайте это общедоступным, и это сработает. - person dan-lee   schedule 17.06.2012