Dondariadmin (トーク | 投稿記録) (→マジックメソッド__call) |
|||
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への以降→下位互換性のない変更点] | ||
− | + | <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<br /> | |
− | + | 26-February-2009<br /> | |
− | + | <br />* Changed __call() to be invoked on private/protected method access, similar to properties and __get(). (Andrei) | |
− | + | </div> | |
===サンプルコード=== | ===サンプルコード=== | ||
− | + | <?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で実行=== | ===PHP5.2.8で実行=== | ||
− | + | PHP Fatal error: Call to private method TestClass::privateMethod() from context '' in a.php on line 19 | |
− | + | ||
===PHP5.2.11で実行=== | ===PHP5.2.11で実行=== | ||
− | + | called private method! | |
− | + | ||
* 本当は5.2.9で実験したかったのですがとりあえず。。。 | * 本当は5.2.9で実験したかったのですがとりあえず。。。 |
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();
PHP Fatal error: Call to private method TestClass::privateMethod() from context in a.php on line 19
called private method!