PHP5.3の無名関数をRefrectionしてみた
http://nonn-et-twk.net/twk/php5.3-lambdaで、
ちなみに無名関数を代入した変数をprint_rすると、Closure Object()とかでてきます。
とあったので、さっそく試してみました。
<?php $function = function() { echo "hello!"; }; var_dump($function);
object(Closure)#1 (0) { }
function() {...}で無名関数を作ったとき、
Closureというクラスのインスタンスが作成されるみたい。
ClosureクラスをReflectionしてみる。
<?php ReflectionClass::export('Closure');
Class [ <internal> final class Closure ] { - Constants [0] { } - Static properties [0] { } - Static methods [0] { } - Properties [0] { } - Methods [1] { Method [ <internal> public method __invoke ] { } } }
Closureクラスはfinalなクラスで、__invoke()というメソッドを持ってるらしい。
ためしに実験。。。ちゃんと動く。
<?php $function = function() { echo "hello!"; }; $function->__invoke(); // hello!
ここでピコーンと思いついて下記のコードを書いてみました。
<?php class Hoge { function __invoke() { echo "hoge"; } } $hoge = new Hoge(); $hoge(); // hoge
これを実行すると、予想通り"hoge"と表示されました。
__invoke()メソッドを書いておくと、
$hoge()で呼び出せる模様。
__invoke()は__call()とか__get()みたいなマジックメソッドなんでしょか。