2015年5月24日日曜日

PHPの__invokeメソッドの使いドコロは?

PHPにはクロージャー(無名関数)と、クラスを無名関数のように使えるようになるマジックメソッド、__invoke、というのがある。これに関する雑感。

クロージャーと言うのは便利なもので、プログラムをデータとして扱える。

$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メソッドを使うメリットは他に何があるか?そんなことを思ったのでブログに書いてみた。

自作フレームワークでのミドルウェア設計

自作中のウェブアプリケーションフレームワークではミドルウェアベースで動きます。基本は「StackPHPとミドルウェア」に書いたとおりですが、実際のインターフェースに落とすまでの過程についてまとめてみます。

と、Blogspotでコードを書くのが面倒なのを思い出したので、gistに書いた。

フレームワークの文章としては、もっと簡潔に必要な箇所だけにまとめる必要があるだろうな。