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
{
    private function foo()
    {
        echo "B foo()\n";
    }
}

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








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

class B, A foo()

Class A の bar() メソッドのコンテクストからは、子クラス B の private メソッドは見えません。


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

<?php

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

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

    protected function baz()
    {
        echo "B baz()\n";
    }
}

$b = new B();
$b->bar('baz');
$b->bar('foo');








答え。

class B, B baz()
class B, PHP Fatal error:  Call to private method B::foo() from context 'A'

class A の bar() メソッドのコンテクストからは、子クラス B の protected メソッドはコールできますが、private メソッドはアクセスできません。


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

<?php

class A
{
    public 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, B foo()

これは予想通りだったのではないでしょうか。