Странное поведение при переопределении частных методов

Рассмотрим следующий фрагмент кода:

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();

Теперь, изменив видимость метода m () , я получаю:
( + для общедоступного , - для закрытого )

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()

( защищенный , похоже, ведет себя как ] public ).

Я ожидал, что все будет вести себя так, как если бы оба были объявлены public . Но хотя foo-> call () и bar-> callbar () по сути одно и то же, они дают разные результаты в зависимости от видимости m () в foo и bar . Почему это происходит?

18
задан NullUserException 21 September 2010 в 01:22
поделиться