AnDeriensのブログ

個人的なブログです

親クラス内から子クラスでオーバーライドしたメソッドを呼べるか

親クラスに定義したメソッドの中から、同じクラス内のメソッドを呼んだとき、 子クラスでオーバーライドしたメソッドが呼ばれるのか、親クラスのメソッドが呼ばれるのか?

メソッドをprotectedにする

<?php

// 親クラスを定義するよ
class ParentClass
{
    protected $name;

    public function __construct($name)
    {
        $this->name = $name;
    }

    // このメソッドを子クラスでオーバーライドするよ
    protected function getName()
    {
        return $this->name;
    }

    public function call()
    {
        // このgetNameメソッド呼び出しは、ParentClassのを呼び出すのかな?
        // それとも、ChildClassの方かな?
        echo $this->getName() . "\n";
    }
}

// 親クラスを継承した子クラスを定義するよ
class ChildClass extends ParentClass
{
    // 親クラスのメソッドをオーバーライド(上書き)するよ
    protected function getName()
    {
        // 子供の名前は、公にしない方がいいから伏せておこうね
        return '******';
    }
}


$open   = new ParentClass('瑛二');
$secret = new ChildClass('サクラ');

$open->call();
$secret->call();

子供の名前が伏字で表示されれば、call メソッド内で呼ばれたgetName メソッドに子クラスのオーバーライドが反映されてることになりますね。

出力

山田
******

子クラスのメソッドをpublicにする

子クラスだけアクセス修飾子を拡張して、publicにしてみる。

- protected function getName()
+ public function getName()

出力

山田
******

メソッドをpublicにする

親クラス、子クラス両方ともアクセス修飾子を拡張して、publicにしてみる。

- protected function getName()
+ public function getName()

出力

山田
******

結論

伏字で表示されました。 つまり、親クラス内でメソッドを呼んでも、ちゃんと子クラスのメソッドを呼んでくれる。