Comportamento estranho ao substituir métodos privados
Considere o seguinte pedaço de código:
class foo {
private function m() {
echo 'foo->m() ';
}
public function call() {
$this->m();
}
}
class bar extends foo {
private function m() {
echo 'bar->m() ';
}
public function callbar() {
$this->m();
}
}
$bar = new bar;
$bar->call();
$bar->callbar();
Agora, alterando a visibilidade dom()
método, eu recebo:
(+
parapublic
, -
paraprivate
)
Visibility bar->call() bar->callbar()
======================================================
-foo->m(), -bar->m() foo->m() bar->m()
-foo->m(), +bar->m() foo->m() bar->m()
+foo->m(), -bar->m() ERROR ERROR
+foo->m(), +bar->m() bar->m() bar->m()
(protected
parece se comportar comopublic
)
Eu esperava que tudo se comportasse como acontece quando ambos são declaradospublic
. Mas apesarfoo->call()
ebar->callbar()
são essencialmente a mesma coisa, eles produzem resultados diferentes, dependendo da visibilidade dom()
nofoo
ebar
. Por que isso acontece?