テンプレートエンジンの基礎

テンプレートエンジンを自作される方も、結構多いのでないでしょうか。
たとえ「車輪の再発明」と言われようとも、楽しいものです。

僕もいくつか自作テンプレートエンジンを作りました。
そこで、PHPにおける、テンプレートエンジンの基礎部分を、ちょっと紹介します。

テンプレートエンジンとは?

テンプレートエンジンとは、PHPやその他の言語において、MVCにおける、ViewとController部分を分けるものです。
もっと簡単にいうと、WEBアプリケーションの開発においては、HTML部分と、プログラミング言語部分を分けたい、ということです。

PHPは元々、PHPとHTMLが混合できることがメリットですが、それは必ずしもメリットではなく、逆に乱用するとデメリットになります。
特に大きなアプリケーションの制作には、PHPにおいても、View(HTML)とController(PHP)を分けることは昨今の常識です。

その効果は、例えばプログラマとデザイナが分業して作業が出来たりするところに利点があります。

テンプレートエンジンの基本

テンプレートエンジンの基本は、プログラムのファイルの中で、テンプレートを読み込んで解析し、そのテンプレートに任意の値を当てはめて、出力することです。
いわばやっていることは、単なる置換です。

例えば、最小のテンプレートエンジンのようなものとして、sprintf関数があります。

<?php
$template = "my name is %s";
echo sprintf( $template , 'sato' );

sprintfは結構優秀で、受け取ったものを順番に、しかも指定フォーマットに変換して置換します。
テンプレートエンジンといっても、やっていることは同じです。

テンプレートエンジンの基礎部分を作ってみる

sprintfだと順番通りにしなければならなかったのですが、それを連想配列に値を渡せばやってくれるようにしたほうがよいでしょう。
そこで、以下のような関数です。

<?php
function template( $template , $list ){
    foreach( $list as $k => $v ){
        $template = str_replace( '#{' . $k . '}' , $v , $template );
    }
    return $template;
}

#{hogehoge}のようにキーを指定したプレースホルダーをテンプレートに埋め込んでおき、与えられたリストにそのキーが存在すれば、置換します。

以下のように使えます。

<?php
$tmpl = "my name is #{name}";
echo template( $tmpl , array('name'=>'sato') );

この関数は非常に基本的なことしかやっていますせんが、これが全ての基礎です。

この他、基本としては、リストとして与えられていないプレースホルダーは邪魔なので、削除しなくてはなりません。

これは、preg_replaceで一発ですね。
改造版です。

<?php
function template( $template , $list ){
    foreach( $list as $k => $v ){
        $template = str_replace( '#{' . $k . '}' , $v , $template );
    }
    $template = preg_replace('/#{.*?}/' , '' , $template );
    return $template;
}

これで、テンプレートエンジンの基礎が出来ました。