Do You PHP はてブロ

Do You PHPはてなからはてブロに移動しました

一番速いテンプレートエンジン - Blitz

という触れ込みのBlitzをさっくり触ってみました。

Blitzの特徴としては、

  • 速い(PHP拡張として作られている)
  • シンプルな構文
  • 複雑なプレゼンテーションロジックも分かりやすく書ける

の3つが挙げられています。また、掲載されているベンチ結果を見るとかなり速そうですが、今回はベンチまでは取ってませんw 今回はCentOS4.5(on VMwarePlayer)+PHP5.2.5+Apache2.2.6という環境で試しています。
インストール手順は、PECLを手動インストールする手順と同じです。

$ phpize
$ ./configure --enable-blitz
$ make
$ sudo make install
$ sudo apachectl graceful
$

具体的な使い方ですが、Smarty辺りを使ったことがある方はすぐに分かると思います。プログラム側は以下のような感じ。

<?php
/* controller class */
class View extends Blitz {
    var $news = array();

    function View($tmpl_name) {
        return parent::Blitz($tmpl_name);
    }

    function set_news($data) {
        $this->news = $data;
    }

    function list_news() {
        $result = '';
        foreach($this->news as $i_news) {
            $result .= $this->include('news_list_item.tpl', $i_news);
        }
        return $result;
    }
}

/* news data, in real applications comes from database or somewhere else */
$news = array(
    array('name' => 'My Bonnie lies over the ocean', 'is_new' => 0),
    array('name' => 'My Bonnie lies over the sea', 'is_new' => 1)
);

/* the output */
$T = new View('main.tpl');
$T->set_news($news);
$T->set(array('title' => 'Blitz Example'));
echo $T->parse();

1つ目のテンプレート(main.tpl)は以下のような感じ。サイトに掲載されているサンプルではlist_newsのあとに「()」がないので、正しく動作しませんでした。まあ、メソッド呼び出しには「()」が必要、と。

<html>
<head><title>{{ $title }}</title></head>
<body>
{{ include('header.tpl') }}

{{ list_news() }}

{{ include('footer.tpl') }}
</body>
</html>

2つ目のテンプレート(news_list_item.tpl)は以下のような感じ。

<b>{{ $name }}</b>{{ if($is_new, '<div class="isNew">NEW!</div>') }}<br>

残りのheader.tplとfooter.tplは空ファイルなど適当に用意してくださいw
で、これを実行すると、

this is header.tpl
My Bonnie lies over the ocean
My Bonnie lies over the sea
NEW!

this is footer.tpl

のように表示されます。
まあ、ここまではどのテンプレートエンジンでも同じなんですが、Blitzには「Context」という機能(?)があります。これは使いようによっては便利かな、と思います。元々php templatesにある機能のようで、バージョン0.4から導入されたとのことです。
BlitzのContextはサブテンプレートのようなもので、テンプレートの一部に名前を付けることができます。そして、アプリ側でBlitz#iterateメソッドを使ってContextを利用します。以下は、サイトにあるサンプルを若干変更したものです。まずはテンプレート(main.tpl)。

{{ BEGIN root }}
  hello, world1
  {{ BEGIN node }}
    hello, world2
    {{ BEGIN item }}
        hello, world3
    {{ END }}
  {{ END }}
{{ END }}

Contextは{{BEGIN}}〜{{END}}までで、BEGINのあとにContext名を指定します。また、Contextはネストすることができます。BEGIN・ENDキーワードはcase-insensitiveですが、Context名はcase-sensitiveです。
PHPコードは次の通り。XPathライクにContextを指定できます。

<?php
$T = new Blitz('main.tpl');
$T->iterate('/root');
echo $T->parse();
echo '<hr>';

$T->iterate('/root/node');
echo $T->parse();
echo '<hr>';

$T->iterate('/root/node/item');
echo $T->parse();
echo '<hr>';


$T = new Blitz('main.tpl');
$T->iterate('/root/node/item');
echo $T->parse();
echo '<hr>';

実行結果は、

hello, world1
hello, world1 hello, world2
hello, world1 hello, world2 hello, world3
hello, world1 hello, world2 hello, world3

な感じ。何となく分かりますかね?
他のテンプレートエンジンの場合、if文で出力を切り替えている事が多いんじゃないかと思いますが、Blitzの場合、利用するContextを切り替えることになるんじゃないでしょうか(全部とは言いませんが)。


ざっとしか触ってませんが、シンプルでヨサゲな印象を受けました。ただ、サイトにあるサンプルに結構typoがあり、どうでも良いところでハマったりしたのはちょっといただけないかな、と。
ということで、試したサンプルを

に上げておきましたので、気になる方はどうぞ。