先日質問したサンプルコードと同じで恐縮なのですが、改めて考えなおしてみるとまたこんがらがってしまいました。(厳密に言うと前回の質問とは別の部分についてなのですが。)
php.netの遅延静的束縛のページの、例3 非静的コンテキストにおける static:: の使用法
php
1<?php 2class A { 3 private function foo() { 4 echo "success!\n"; 5 } 6 public function test() { 7 $this->foo(); 8 static::foo(); 9 } 10} 11 12class B extends A { 13 /* foo() が B にコピーされるので、メソッドのスコープは A のままとなり、 14 * コールは成功します */ 15} 16 17class C extends A { 18 private function foo() { 19 /* もとのメソッドが置き換えられるので、新しいメソッドのスコープは C となります */ 20 } 21} 22 23$b = new B(); 24$b->test(); 25$c = new C(); 26$c->test(); //fails 27?>
result
1success! //➊ 2success! //➋ 3success! //➌ 4 5 6Fatal error: Call to private method C::foo() from context 'A' in /tmp/test.php on line 9 7//➍
について質問して、➌以外の結果については理解できたのですが、➌の結果、つまり
$c->test();
↓
$this->foo();
の部分がなぜsuccess!と表示されるのかわかりません。
前回頂いた解答で、➌の部分では$thisはクラスAを指す、だからクラスAのfoo()が実行されてsuccess!と表示される、とあったのですが、改めて考えてみると、$thisは$cを指すように思います。
クラスCではfooメソッドがオーバーライドされているので、$cのfoo()が呼ばれると、Cクラスのfooメソッド、つまり空のメソッドfoo()が実行される、つまり➌は「何も表示されない」という動作になるのではないか、と思うのですが、実際動かすとsuccess!と表示されます。
$thisが$cを指すと思う理由↓
php
1class PPP{ 2 public function pri(){ 3 echo 'pppPPPP'; 4 } 5 public function meth(){ 6 echo $this->pri(); 7 } 8 9} 10 11 12class QQQQ extends PPP{ 13 public function pri(){ 14 echo 'qqqqq'; 15 } 16} 17 18$ins_Q=new QQQQ; 19 20$ins_Q->meth(); 21//結果: qqqqq
まず$thisは$cを指す、ということでよいでしょうか?
あとなぜこの結果になるのでしょうか?
よろしくお願い致します。
回答3件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/02/07 17:27
2019/02/08 04:54
2019/02/09 02:58