クロージャーと言うのは便利なもので、プログラムをデータとして扱える。
$hello = function($world) {便利なケースを思いつかなかったので、適当に書いたコード。
return 'hello ' . $world;
};
一方で、__invokeメソッドの使いドコロは何だろう。
自分が思いつくのは、
1.流行りのファンクショナルな言語のように書ける。
2.メソッド名を考えなくても使える。
3.クロージャーの代わりにオブジェクトを使いたい場合に必要。
最初の1.と2.は冗談なので、実際は3.の場合かなと思える。つまり何かの関数の引数としてクロージャーを想定している場合でも、オブジェクトが使える。
でも3.の理由は、クラス自体でのメリットというより、必要だからという感じがする。
あとPHPの問題として、意外なところでコードのパースが悪いところがある。せっかくコンパクトに書けるはずのクロージャーなのに、かえってコードが複雑になってしまう。
class Hello {
private $hello;
function __construct($hello) {
$this->hello = $hello;
}
function hello($world) {
return $this->hello($world); // 動かない!
}
}
なんで、こんなことを書いてるかって?
いや、1.と2.の理由で__invoke使って見たら、意外と面倒で。一方で感じたメリットは3.しかなかったので。それで__invokeメソッドを使うメリットは他に何があるか?そんなことを思ったのでブログに書いてみた。