親クラスに定義したメソッドの中から、同じクラス内のメソッドを呼んだとき、 子クラスでオーバーライドしたメソッドが呼ばれるのか、親クラスのメソッドが呼ばれるのか?
メソッドを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()
出力
山田 ******
結論
伏字で表示されました。 つまり、親クラス内でメソッドを呼んでも、ちゃんと子クラスのメソッドを呼んでくれる。