第13回 次世代のSmarty - Smarty3の紹介 (その1)

第7回で、現在開発中の次バージョンSmarty3のことについて少し触れました。
今回はそのSmarty3について掘り下げてみたいと思います。
なお、Smarty3は現在まだ開発中ですので、今後仕様や動作が変わる可能性があります。
執筆時点(2009年4月頭)での仕様を前提として書かせていただきますのでご了承ください。
Smarty3の特徴
さて、Smarty3になることで今までのSmarty2と何が変わるのでしょう? 現時点でわかっている変更点を列挙してみたいと思います。
◎ 今まで通りの方法でSmartyを使うことが出来る
何が変わるのでしょう? と振っておきながら今まで通りかよ!! とツッコミが入りそうですが、バージョン2で使っていた呼び出し方法やテンプレートの記述方法はそのまま利用できます。(但し、PHP4でSmarty3は動作しませんので、注意してください)
しかし、中身は全くの別物になっています。
今回のSmarty3では、クラス設計が全体的に見直されています。それにより、Smartyクラスを定義しているSmarty.class.phpが非常にスリムな作りになっています。
Smarty3の設計方針の中に「lazy-load(遅延ロード)」という手法が挙げられています。
これは「必要なモノは必要なときに呼び出す」という考え方で、組み込み関数やSmartyメソッドなどもすべてクラス化しプラグイン化しています。
そして、使うときになって初めてプラグインを呼び出し使えるようになるのです。但しこの処理は内部で行われるので、使う側は特に意識する必要はありません。
◎ テンプレートの解析方法を変更
バージョン2までは、テンプレートファイルの解析に正規表現によるパターンマッチングを使っていました。
単純なテンプレートの解析であれば、このレベルの解析方法でも全く問題はありませんでした。
しかし正規表現に頼る解析方法では、関数の再帰呼び出しなどちょっと複雑なことをやろうとすると、とたんに無理が生じてしまいます。
そこでSmarty3では、テンプレートファイルの字句解析、構文解析をしっかりやる方針に切り替わりました。
通常、プログラミング言語のコンパイラなどを作る際、字句解析器や構文解析器を作るのにLexやYaccなどといったツールを用います。
Smarty3では、字句解析クラスの生成にはPHP_LexerGenerator、構文解析クラスの生成にはPHP_ParserGeneratorを使っています。
配布されるのは開発側で生成された解析用クラスなので、使う側はあまり意識する必要はありませんが、これによりテンプレートの計算とか、関数の再帰呼び出しとか、今までの仕組みでは解決できなかった色々な問題が解決しそうだと期待されています。
◎ Smartyオブジェクトがシングルトンに
上に挙げた2つはSmartyの中の話なので、使う人にとってはあまり馴染みのない話かもしれません。ここから少しずつユーザーに関わりのあるポイントを挙げていきます。
まずはPHP側の話。
Smartyオブジェクトの取得方法として、デザインパターンのSingletonパターンを用いることが出来るようになりました。Singletonパターンとは、そのクラスのインスタンスが1つだけしか生成されないようにするパターンのことです。
今回、Smartyクラスにinstance()というstaticメソッドが用意されました。
$smarty = Smarty::instance()
これを呼び出すことにより、一度生成したSmartyインスタンスはPHPコード内であればどこでも呼び出すことが出来るようになります。
(但し、一度newを使ってSmartyクラスのインスタンスを生成する必要があるので、厳密なSingletonパターンではないような気がしますけどね……)






