タグ別アーカイブ: メタプログラミング

普段使い用のPHPを5.5.6にバージョンアップ

私が自分でPHPのコードを書くのは、WordPressのちょっとしたカスタマイズなどを除けば、コマンドライン用途がほとんどです。簡単なツールを作ったり、メタプログラミングのために他の言語の前処理に使うといった使い方になります。そんな事情なので、あまり最新版を追いかける必要もなく、これまでは少し古めの5.4.11を使っていました。

たまたまPHPに関して調べ物をする機会があり、最新版も(当然予想していたことですが)かなりバージョンが上がっていることに気づきましたので、この機会にバージョンアップすることにしました。といっても、バグフィックスを除けば、バージョンアップの恩恵といえばfinallyが使えるようになったぐらいで、他は気づくような変化はなさそうです。

PHPのクラスにはデストラクタがあるので、あえてfinallyを使う必要もないのですが、PHPのクラスは遅く、できればクラス無しで書きたいという動機もわからないでもありません。であれば、finallyがあるのも悪くないかとは思います。

あと、ジェネレータももしかしたら使うかもしれません。ジェネレータというとわかりにくいのですが、イテレータを作るためのyield文のことで、C#でおなじみのやつです。

こんな感じで、今後はPHP 5.5.xを前提とした使い方にシフトしていくことになるでしょう。

PHPプログラマーが知らないPHPの用法

この話題はリニューアル前のサイトでも取り上げたことがあります。簡単にいうと、PHPを使ったソースコードの前処理を行おうということです。

「PHPプログラマーが知らない…」とは書きましたが、もちろん知っている方も少なくないとは思います。ですが、大多数のPHPプログラマーはHypertext Preprocessorの名が示すように、HTMLに埋め込んで使う用法しか知らないのではないでしょうか? おそらく、コマンドラインでPHPが使えること自体を知らない可能性さえあります。

PHPは通常、基本的にHTMLが書かれたソース中に、<?php ではじまり ?> で終わるタグを埋め込むことで使えるようになります。しかし、埋め込む相手はHTMLである必要はなく、CやJavaのソースに埋め込んでも何ら問題ありません。実際、期待通りに前処理を行ってくれます。

Javaのようにプリプロセッサがない言語の場合、PHPはかなり強力なツールになります。CやC++のような前処理ができる言語であっても、標準のプリプロセッサよりははるかに高度な機能を提供することができるのです。

具体例を挙げましょう。配列やコンテナの要素を静的に整列するといったことは、Cのプリプロセッサではごく限定的な状況をのぞいて実現することはまず無理でしょう。しかし、PHPを使えばいとも簡単に実現できてしまいます。

PHPを使えば、バイナリファイルを配列の初期化子として展開するような前処理を行うことさえできます。これは標準のCプリプロセッサでは不可能です。

ほかにも、Cのプロトタイプを解析してC#のためのDllImportを自動生成するとかいう荒技もできてしまいます(もちろん、PHPのコードはそれなりに複雑になりますので、がんばって実装する必要があります)。

このように多くのメリットを持つPHPによる前処理ですが、弱点がないわけではありません。一番大きな弱点は、インテリセンスのような入力補完機能の邪魔をするということでしょうか? EclipseでJavaを使うときなど、ツールがいろいろおせっかいを焼いてくれる環境の場合は、結構大きな制約につながるかもしれません。

PHPによる前処理を行うと、状況にもよるのですが、行番号がずれてしまい、エラーメッセージが読みにくくなるという問題もあります。

このようにPHPによる前処理は万能ではなく欠点もあります。ですので、すべてのソースファイルをPHPで前処理するのではなく、一部の本当に前処理が必要なソースだけPHPを通すというのが現実的な使い方かと思います。