PHP でプライベートメソッドをオーバーライドした場合

さて、問題です。以下のコードの実行結果はどうなるでしょう?

<?php

class A
{
    private function foo()
    {
        echo "A foo()\n";
    }

    public function bar()
    {
        echo 'class ', get_class($this), ", ";
        $this->foo();
    }
}

class B extends A
{
    public function foo()
    {
        echo "B foo()\n";
    }
}

$b = new B();
$b->bar();









答え。

以下のようになります。エラーにはなりません。

class B, A foo()

なんとなく釈然としないんですが、以前からそういうものなんですよね。


次の問題です。以下のコードの実行結果はどうなるでしょう?

<?php

class A
{
    public function foo()
    {
        echo "A foo()\n";
    }

    public function bar()
    {
        echo 'class ', get_class($this), ", ";
        $this->foo();
    }
}

class B extends A
{
    private function foo()
    {
        echo "B foo()\n";
    }
}

$b = new B();
$b->bar();








答え。

Fatal error: Access level to B::foo() must be public (as in class A) になります。

これも釈然としないんですが、これも以前からそういうものなんですよね。