マジックメソッド__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
  • TestClassの"privateMethod"を呼びだそうとするが、それは private宣言されているのでアクセスできない。→エラー

PHP5.2.11で実行

called private method!
  • TestClassの"privateMethod"を呼びだそうとするが、それは private宣言されているのでメソッドが無いものとして扱い、__callメソッドが実行される。
  • __callメソッドからはprivate宣言された"privateMethod"を呼び出すことが可能なので、正常に実行される。


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

facebook slideshare rubygems github qiita