(マジックメソッド__call)
 
(2人の利用者による、間の2版が非表示)
9行目: 9行目:
 
[http://www.php.net/manual/ja/migration53.incompatible.php PHP5.2.XからPHP5.3.Xへの以降→下位互換性のない変更点]
 
[http://www.php.net/manual/ja/migration53.incompatible.php PHP5.2.XからPHP5.3.Xへの以降→下位互換性のない変更点]
  
    マジックメソッド __call  は、private や protected のメソッドに対するアクセスでも呼び出されるようになりました。  
+
<div style="border:1px solid #aaa; margin-left:1em; padding:0.5em; overflow:auto">
 
+
マジックメソッド __call  は、private や protected のメソッドに対するアクセスでも呼び出されるようになりました。  
 +
</div>
  
 
[http://jp2.php.net/ChangeLog-5.php ChangeLog]では下記が該当箇所ですね。
 
[http://jp2.php.net/ChangeLog-5.php ChangeLog]では下記が該当箇所ですね。
 
+
<div style="border:1px solid #aaa; margin-left:1em; padding:0.5em; overflow:auto">
    Version 5.2.9
+
Version 5.2.9<br />
    26-February-2009
+
26-February-2009<br />
   
+
<br />* Changed __call() to be invoked on private/protected method access, similar to properties and __get(). (Andrei)
    * Changed __call() to be invoked on private/protected method access, similar to properties and __get(). (Andrei)
+
</div>
  
 
===サンプルコード===
 
===サンプルコード===
 
+
<?php
    <?php
+
class TestClass
    class TestClass
+
{
    {
+
    public function __call($name, $arguments)
        public function __call($name, $arguments)
+
    {
        {
+
        if ($name == 'privateMethod') {
            if ($name == 'privateMethod') {
+
            $this->privateMethod();
                $this->privateMethod();
+
        }
            }
+
    }
        }
+
   
       
+
    private function privateMethod()
        private function privateMethod()
+
    {
        {
+
        echo "called private method!\n";
            echo "called private method!\n";
+
    }
        }
+
}
    }
+
$test_class = new TestClass();
   
+
$test_class->privateMethod();
    $test_class = new TestClass();
+
    $test_class->privateMethod();
+
  
 
===PHP5.2.8で実行===
 
===PHP5.2.8で実行===
 +
PHP Fatal error:  Call to private method TestClass::privateMethod() from context '' in a.php on line 19
  
    PHP Fatal error:  Call to private method TestClass::privateMethod() from context '' in a.php on line 19
+
*TestClassの"privateMethod"を呼びだそうとするが、それは private宣言されているのでアクセスできない。→エラー
  
 
===PHP5.2.11で実行===
 
===PHP5.2.11で実行===
 +
called private method!
 +
 +
*TestClassの"privateMethod"を呼びだそうとするが、それは private宣言されているのでメソッドが無いものとして扱い、__callメソッドが実行される。
 +
*__callメソッドからはprivate宣言された"privateMethod"を呼び出すことが可能なので、正常に実行される。
  
    called private method!
 
  
 
* 本当は5.2.9で実験したかったのですがとりあえず。。。
 
* 本当は5.2.9で実験したかったのですがとりあえず。。。
 +
 +
[[Category:PHP]]

2013年4月20日 (土) 22:40時点における最新版

マジックメソッド__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