遊星ゲームズ
FrontPage | RSS


PHP最小のテンプレートエンジン
 プログラム

 PHPはもともとがテンプレートエンジンみたいなモノで、別にわざわざテンプレートエンジンを使う必要なんかない気もする。
 でもやっぱり使うと便利なときもある(かえって不便なときもある)。
 じゃあテンプレートエンジンに必要な機能ってなんだろう。

  • 変数をアサインする
  • テンプレートファイルを読み込んで表示する
  • テンプレート中で、アサインした変数を(簡単に)呼び出せる
  • if文とfor文

 まあそういうことだよな。
 テンプレートエンジンを使わない場合、単純な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なんてただのテンプレートエンジンで、言語じゃない」っていうのはぜったい信じちゃダメと思う。そんなこといってる人は本物の技術を知らないと思う。上のはそういう意味じゃないです。


PHP最小のテンプレートエンジンを