PHPはもともとがテンプレートエンジンみたいなモノで、別にわざわざテンプレートエンジンを使う必要なんかない気もする。
でもやっぱり使うと便利なときもある(かえって不便なときもある)。
じゃあテンプレートエンジンに必要な機能ってなんだろう。
まあそういうことだよな。
テンプレートエンジンを使わない場合、単純なincludeとかでテンプレートファイルを呼び出せばいい。もちろん、テンプレートを分けないよりは何千倍もいい。
PHPそのものなら、if文でもなんでもつかえる。テンプレートエンジンの機能はすでに実現されているわけで、つまりincludeがあればテンプレートエンジンは必要ないんである。
テンプレートエンジン記法のほうが読みやすい、PHPネイティブだとif文の{}とかがすごく見づらい、という意見もあるかもしれない。これには解決法があって。
<? if($hoge) { ?>
<?= $hoge ?>
<? } ?>
なんてのはかなり見づらくなるわけだけど、でもこれを
<? if($hoge) : ?>
<?= $hoge ?>
<? endif ?>
こう書きかえれば、だいぶ読みやすくなる。じっさい、このためにこんな記法が残ってる。
こんなのでも、JSPのうんたらタグとかよりは書きやすい気がするし(わたしが慣れてないだけ)。というか、テンプレートエンジンごとの独自記法なんていちいち憶えられないし、これでいいような気もする。
ただ一点、問題がある。
この方法だと、グローバル変数を使うことになってしまうんである。グローバル変数はもちろん大問題だ(世界中のすべての人にこう思ってほしい……)。
テンプレートエンジンを使う場合と使わない場合、なにが違うかといえばこれだ。
表示用変数の名前を制限するとか、コーディング規約的なやりかたで縛るという方法はあるだろう。規約を守る体制があるなら、それでもいいだろう。つまり、規約は守られないので、なにか強制力のある仕組みが必要なのである。
というわけで、PHPのテンプレートエンジンに必要な機能があるとすれば。
「グローバルでない、表示専用のスコープを提供すること」
なんじゃないか。
そういったことをふまえて、ネイティブPHPの機能を最大限に活用したテンプレートエンジンを書いてみよう……。
class EasiestTemplate
{
public function show($____file)
{
extract((array)$this);
include $____file;
}
}
8行で実現!
$template = new EasiestTemplate();
$template->hoge = 'piyo';
$template->show('foo.tpl.php');
これでも、なんかそれっぽい書きかたにはなる。
(PHPは、定義していないpublic変数を外から作られても文句をいわない)
うーん、ほんとにこれでいいなあ……。
余計なことしないし、パフォーマンスの問題もないし、なにより学習の必要がない。これが理想的なテンプレートエンジンだ! という人がいてもいいと思う。
てらしま -2009/06/22 01:51
よくきく「PHPなんてただのテンプレートエンジンで、言語じゃない」っていうのはぜったい信じちゃダメと思う。そんなこといってる人は本物の技術を知らないと思う。上のはそういう意味じゃないです。