Dondariadmin (トーク | 投稿記録) |
|||
(同じ利用者による、間の1版が非表示) | |||
41行目: | 41行目: | ||
===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! | called private method! | ||
+ | |||
+ | *TestClassの"privateMethod"を呼びだそうとするが、それは private宣言されているのでメソッドが無いものとして扱い、__callメソッドが実行される。 | ||
+ | *__callメソッドからはprivate宣言された"privateMethod"を呼び出すことが可能なので、正常に実行される。 | ||
+ | |||
* 本当は5.2.9で実験したかったのですがとりあえず。。。 | * 本当は5.2.9で実験したかったのですがとりあえず。。。 | ||
+ | |||
+ | [[Category:PHP]] |
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!