Comportement étrange lors de la substitution des méthodes privées

Considérer le morceau de code suivant:

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

Maintenant, l'évolution de la visibilité de l' m() méthode, j'obtiens:
(+ pour public, - pour private)

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 semble se comporter comme public).

Je m'attendais à tout pour se comporter comme il le fait lorsque les deux sont déclarés public. Mais bien que foo->call() et bar->callbar() sont essentiellement la même chose, ils aboutissent à des résultats différents en fonction de la visibilité de m() dans foo et bar. Pourquoi est-ce arrivé?

Il joue différents dans la troisième ligne du résultat,la mienne est foo->m() de la barre->m(),aucune erreur n'est survenue
Comme pour fins de clarification voici le lien à votre troisième cas, stackoverflow.com/questions/18010637/...
foo::appelez le() et le bar::callbar() ne sont pas la même chose. Ils ont des portées différentes. Champ d'application définit si vous pouvez appeler méthode privée. Penser comme ceci: méthode privée est un détail de l'implémentation de la classe, seul le code à l'intérieur de cette classe peut l'appeler.

OriginalL'auteur NullUserException | 2010-09-21