マジックメソッド__call

互換性のない変更点

PHP5.2.9以降で、__callメソッドの挙動に変更がありました。

下記はPHP5.2.XとPHP5.3.Xについての記述ですが、この点についてはPHP5.2.8とPHP5.2.9についても同様の変更が加えられたということですね。

PHP5.2.XからPHP5.3.Xへの以降→下位互換性のない変更点

   マジックメソッド __call  は、private や protected のメソッドに対するアクセスでも呼び出されるようになりました。 


ChangeLogでは下記が該当箇所ですね。

   Version 5.2.9
   26-February-2009
   
   * Changed __call() to be invoked on private/protected method access, similar to properties and __get(). (Andrei)

サンプルコード

   <?php
   class TestClass
   {
       public function __call($name, $arguments)
       {
           if ($name == 'privateMethod') {
               $this->privateMethod();
           }
       }
       
       private function privateMethod()
       {
           echo "called private method!\n";
       }
   }
   
   $test_class = new TestClass();
   $test_class->privateMethod();

PHP5.2.8で実行

   PHP Fatal error:  Call to private method TestClass::privateMethod() from context  in a.php on line 19

PHP5.2.11で実行

   called private method!
  • 本当は5.2.9で実験したかったのですがとりあえず。。。

facebook slideshare rubygems github qiita