NYPHPでNate Abeleの「On the origin of Lithium」を聞いてきた
ニューヨークのPHPコミュニティが毎月開催しているNYPHPに参加してきました。
NYPHPは毎回、一人のスピーカーが1時間半ほど喋り、その後はTGI FRYDAYに行くという形式で開催されている勉強会です。
今回のスピーカーはCakePHPの元リードデベロッパーのNateによるLithiumのお話という事で、疲れ気味の体に鞭を打って参加してきました!
講演の内容のポイントを紹介します。
PHPとフレームワークの歴史
プレゼンテーションは最初にLithiumはもうCakePHPではないという事、枝分かれした存在である事について触れてからLithiumが誕生するまでのPHPの歴史を振り返ります。最初はPHP/FIから始まり、マークアップ的に処理が記述できる例などを示し、そこからPHP3、PHP4、PEAR、PHP5、CakePHP、symfony、CodeIgniter、Zend,,,という風にPHPにさまざまな技術的な進歩がもたらされた事をコメント付きで紹介していきます。ただのスクリプトでしかなかったPHPがだんだんと整理された機能になっていく事がわかります。また特にCakeやsymfonyについてNateがコメントする部分では質問が出る事もありこれだけでかなりの時間が。
これらの進歩により、機能をオブジェクトとしてデザインされたライブラリとして実装するという統一性は達成されましたが、引き換えにフレームワーク内の密結合や、拡張性が失われるといった事が起きています。また機能そのものについての論争のような事は極めて表面的なトピックに過ぎず、答えは人の数だけあり各自の判断でより生産的だと思うものを選択すればよいという事も述べていました。(例としてソースのインデントをタブにするかスペースにするかといった話など)
PHP5.3
そしてPHPに訪れた大きな変化として、Late Static Binding, Namespace, Clousureの話へと進みます。Late Static Bindingによりstaticなメソッドやプロパティを持ったクラスの派生クラスをようやく書くことができるようになりました。(正確には書くことはできるが、継承元のクラスから派生クラスのメソッドをコールバックするような形にできない)またNamespaceによりこれまでは各ライブラリやフレームワークが独自の工夫で解決していたクラスとファイル名をマッピングする為のルールのベースが言語としてようやくサポートされました。そしてClousureはメソッドの呼出しなどのバリエーションをさらに柔軟にする事ができるようにしてくれます。
このあたりからちょっとしたコードを書いて説明したりするようになりめちゃくちゃ面白くなってきます!
Lithiumのデモ
PHP5.3の機能の紹介からLithiumのデモへとセッションは進みます。CakeFestの時にも言っていましたが、Lithiumはブートストラップが非常に薄くなっており、処理は2行しかありません。その後の初期化処理としてはLibrariesクラスを利用してライブラリを登録する処理が行われます。ここでポイントとなるのはLithium内でつかわれるクラス群もこのLibrariesを介して操作するという事です。つまり、このLibrariesクラスを介してZendのライブラリなどを登録した場合、フレームワーク内では特に区別されず、コアクラス自体を差し替える事もできるのです。
通常、多くのフレームワークは内部で特定のクラスをハードコードして呼び合う部分がかなりの部分あり、そこが拡張しづらいポイントとなり制約となります。(symfonyもfactories.ymlである程度制御できますが、ハードコードされている部分もかなりありますね)それをPHP5.3の機能を生かして拡張可能な形を実現したのが大きなアイデアです。
またクロージャを生かして、オブジェクトへの設定などをより柔軟に与える事ができるようになった例をいくつか。たとえばRouterに対するルーティングの設定としてModelからFindした結果をマッピングして渡す、など。PHP5.3以前でやるとすれば、データを取得したのちに配列へ格納し、ループしながら設定するなどの工夫が必要になるところですが、クロージャを利用することで一行で記述できました。
そして最後にLithiumのフィルタ機能についてのデモに入ります。フィルタ機能は任意のクラスの任意の処理の前後に処理を設定する事が出来る機能です。たとえばデータベースのログを取得したければ、Databaseクラスのexecuteにフィルタを設定するといった形です。通常ならこのように処理の前後に介入するならばコールバックを設けるか、派生クラスを作りラッパーメソッドを書くところでしょう。これをシンプルな記述だけで実現する事ができます。
応用の例としてLithiumのコードカバレッジの取得がこのフィルタ機能を使っている事が明かされました。(xDebugのダンプだとデータが大きすぎる)
まとめ
Lithiumの思想についてはこれまでのたびたび、和訳で紹介してきました。しかしながら実際のデモやその他のフレームワークなどに言及しつつNateの話を聞くことでよりはっきりとその思想を理解する事ができました。通常、フレームワークというとどんな機能があるとか何が出来るといったポイントで評価しがちですがこれはNateの言葉を借りるなら「表面的で、人の数だけ答えがある」という話なのだと思います。
LithiumがCakePHPだけでなくさらに多くのフレームワークや技術の反省点を生かした上で「拡張性・軽量性」を追求しているという事がよくわかりました。
Lithiumの拡張性は高く、ORマッパにDoctrineを組み込む実装などが簡単に行えます。機能に気に入らない部分があれば作りかえるなり、他から借りてくればよい。ただしその設定や拡張に複雑な実装が必要ないように。ということですね。
一見難しいフレームワークという印象だったのですが、CakePHPの機能は引き継がれており拡張などをする場合はCakePHPよりもシンプルに記述する事ができます。
いやー、これは面白かったです。
おまけ
懇親会はTGI FRIDAYS。最初にハイネケンを頼んだ後に、バーガーを頼んだら「セットにできるよ」と言われてそれに。最初のビールに付け足してくれるのかと思いきやビールももう一杯きてちょっと大変でした・・・。