February 18, 2006
PHPのすごさは何より「require」文だと思う。
require文は、いわゆる外部のphpをincludeする命令である。PHPのrequire文は、その命令が「実行した段階」からphpファイルがincludeされ、何食わぬ顔をしてあらゆる変数を引き継いだまま、include元のphpコードの続きとして実行される。
逆に言うと、require文を「実行しなければ」ソースコード中に書かれたinclude先のコードが呼び出されることはない。
これ最強だと思うんだが、他の言語ではどうなんだろう。
MVCモデルで言うコントローラーを作りたければ、
switch (分岐用変数)
case 条件1:
require "条件1のPHP";
break;
case 条件2:
require "条件2のPHP";
break;
・
・
・
最低限のものなら、たった、これだけで終わり。なんなら、これだけを書いたphpを定義ファイルとしてしまえば良い。それ自体もrequiredで呼び出すことができる。
Javaで何故これを実現するのに、わざわざstruts.confにいつまで経っても覚えられない特殊文法のXMLを書いていたのか?が不思議に思えてきた。
この柔軟な機能は、他の言語で存在するのだろうか?ASPでは、そもそもこういう柔軟性の高いincludeはできないし、ServletやJSPでは、ここまで透過的なアクセスは不可能だと思う。
PHPをメインで使う人で、このありがたさをありがたいと気がついている人はどれぐらいいるのだろうか。PHP自体が、C言語のWeb向けラッパー言語であり、その豊富な関数群を含めてWebアプリケーションフレームワークと言えるわけだが。(そして、自分が欲しいと思った機能は、かなりの確率でPHPの組み込み関数とPEARでフォローされているのがスゴイ。)
もちろん上記のrequiredの連鎖をしていった場合、複数プログラム内からグローバル変数にアクセス可能な状態になってしまうことの危険性はあるので、そこはそれMVCフレームワークなどを開発のルールブックとして導入し、PHPファイル毎の役割分担を作ることで対処するわけだ。君はコントローラだから繋ぐ処理だけね。君はモデルだからデータベースアクセスとロジックだけ書こうね・・・と。
最終段の出力はSmartyに限定すればよい。そうすればプログラム中にデバッグで書いたecho文は全部ゴミだ。最後にEclipseの検索でechoを検索して、もし見つかったら削除してしまえば終わり。
チームでは通常出力にecho文を使うなということを徹底する。最後に消しちゃうからよろしく・・・で良いんではないかと。echoを検索するぐらいのソースコードチェックなら毎朝やっても良いだろう。それが会話で通用しない相手であれば、Javaを使った場合でも、どっちにしろ違う苦労を強いられる。
PHPにPEARというライブラリ群を組み合わせると、ログとかDBとかエラー処理などのフレームワークで必要な機能は満たされているし、テンプレートエンジンはSmartyが決定版なので、フレームワークのプロダクトにおいて、機能面以外は、結局のところ、どういう手順と役割を決めたphpファイルをrequireするか?という実装に落ち着いているんではないのだろうか?
それが当たり前に存在していたこと。そこにPHPのすばらしさだったと思うところで、なんでもっと早くPHPにしなかったのか?を悔やむことが過去に沢山ある(w
(人のこと言えないけど、開発者は、ややこしいこと=高度=自己の価値・・・と考える傾向があって非常によろしくないですね。)