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()みたいなマジックメソッドなんでしょか。