PHPで、オブジェクトのメソッド内からスタティックメソッドを呼び出す
2008年2月29日
PHP5の話。表題のことについて良く理解していない部分があったので、テストコードを実行してまとめてみた。
オブジェクトのメソッド内からスタティックにメソッドを呼び出しても、$thisオブジェクトは保存される。たとえ、呼び出すメソッドが、オブジェクト自身と何の関連の無いクラスに記述されていても。ただし、呼び出すメソッドが『static』指定されている場合は別で、$thisオブジェクトは使えない。
実験に用いたコード
実行結果(PHP 5.2.5)
オブジェクトのメソッド内からスタティックにメソッドを呼び出しても、$thisオブジェクトは保存される。たとえ、呼び出すメソッドが、オブジェクト自身と何の関連の無いクラスに記述されていても。ただし、呼び出すメソッドが『static』指定されている場合は別で、$thisオブジェクトは使えない。
実験に用いたコード
<pre><?php class test1 { public function __destruct(){ if (isset($this)) echo "test1->__destruct():$this->test\n"; else echo "test1::_destruct()\n"; } public function _test1(){ if (isset($this)) echo "test1->_test1():$this->test\n"; else echo "test1::_test1()\n"; } public function _test6(){ test2::_test4(); test3::_test7(); } } class test2 extends test1{ public function __destruct(){ if (isset($this)) echo "test2->__destruct():$this->test\n"; else echo "test2::_destruct()\n"; parent::__destruct(); } public function _test2(){ self::_test1(); parent::_test1(); test1::_test1(); } public function _test3(){ self::_test4(); test2::_test4(); self::_test5(); test2::_test5(); } public function _test4(){ if (isset($this)) echo "test2->_test4():$this->test\n"; else echo "test2::_test4()\n"; } static public function _test5(){ if (isset($this)) echo "test2->_test5():$this->test\n"; else echo "test2::_test5()\n"; } } class test3{ public function _test7(){ if (isset($this)) echo "test3->_test7():$this->test\n"; else echo "test3::_test7()\n"; } } $t1=new test2; $t1->test='$t1->test'; $t2=new test2; $t2->test='$t2->test'; $t3=new test1; $t3->test='$t3->test'; // following line causes a fetal error //test2::__destruct(); ?>-----obj->_test2-----<br><?php $t1->_test2(); $t2->_test2(); ?>-----obj->_test3-----<br><?php $t1->_test3(); $t2->_test3(); ?>-----test2::_test2/3-----<br><?php test2::_test2(); test2::_test3(); ?>-----obj->_test5-----<br><?php $t1->_test5(); $t2->_test5(); ?>-----obj->_test6-----<br><?php $t3->_test6(); ?>-----destruct-----<br>
実行結果(PHP 5.2.5)
-----obj->_test2----- test1->_test1():$t1->test test1->_test1():$t1->test test1->_test1():$t1->test test1->_test1():$t2->test test1->_test1():$t2->test test1->_test1():$t2->test -----obj->_test3----- test2->_test4():$t1->test test2->_test4():$t1->test test2::_test5() test2::_test5() test2->_test4():$t2->test test2->_test4():$t2->test test2::_test5() test2::_test5() -----test2::_test2/3----- test1::_test1() test1::_test1() test1::_test1() test2::_test4() test2::_test4() test2::_test5() test2::_test5() -----obj->_test5----- test2::_test5() test2::_test5() -----obj->_test6----- test2->_test4():$t3->test test3->_test7():$t3->test -----destruct----- test1->__destruct():$t3->test test2->__destruct():$t2->test test1->__destruct():$t2->test test2->__destruct():$t1->test test1->__destruct():$t1->test