概要
2009年の終わりごろ、私はPHP / HTML用の簡単なテンプレートシステムを作成し、デザイナーがパンフレットウェアタイプのWebサイトに社内で使用できるようにしました。このシステムの目標は、PHPで処理されるカスタムタグを介して、純粋なHTMLでテンプレートを作成できるようにすることです。たとえば、テンプレート化されたページは次のようになります。
<tt:Page template="templates/main.html">
<tt:Content name="leftColumn">
<p> blah blah </p>
...
</tt:Content>
<tt:Content name="rightColumn">
<p> blah blah </p>
...
</tt:Content>
</tt:Page>
テンプレート自体は次のようになります。
<html>
<head>...</head>
<body>
<div style="float:left; width:45%">
<tt:Container name="leftColumn" />
</div>
<div style="width:45%">
<tt:Container name="rightColumn" />
</div>
</body>
</html>
PageタグとContent/Containerタグの他に、フロー制御、コレクションの反復処理、動的値の出力などのタグがコアに含まれています。フレームワークは、独自のセットを簡単に追加できるように設計されています。別のプレフィックスと名前空間で登録されたタグ。
PHPへのカスタムタグ
これらのカスタムタグをどのように解析しますか?HTMLファイルが整形式のXMLであるという保証はないため、XSLT/XPATHのようなソリューションは信頼できません。代わりに、正規表現を使用してプレフィックスが登録されているタグを検索し、それらをPHPコードに置き換えます。PHPコードはスタックベースの設計です...開始タグに遭遇すると、タグを表すオブジェクトがスタックにプッシュされて作成され、その「初期化関数」(存在する場合)が実行されます。登録された終了タグが検出されるたびに、最新のオブジェクトがスタックからポップされ、その「レンダリング機能」が実行されます。
したがって、フレームワークがテンプレートタグをPHPに置き換えた後、サンプルページは次のようになります(実際には少し醜いです)。
<?php $tags->push('tt', 'Page', array('template'=>'templates/main.html')); ?>
<?php $tags->push('tt', 'Content', array('name'=>'leftColumn')); ?>
<p> blah blah </p>
...
<?php $tags->pop(); ?>
<?php $tags->push('tt', 'Content', array('name'=>'rightColumn')); ?>
<p> blah blah </p>
...
<?php $tags->pop(); ?>
<?php $tags->pop(); ?>
良い、悪い、そしてeval
では、新しく生成されたPHPコードを実行する方法は?ここでいくつかのオプションを考えることができます。最も簡単なのはeval
文字列を単純化することであり、それで十分に機能します。eval
ただし、プログラマーなら誰でも「evalは悪です、使用しないでください...」と言うので、ここで使用できるよりも適切なものはありますか?
一時ファイルまたはキャッシュファイルの使用、php://
出力ストリームの使用などを検討しましたが、私が見る限り、これらはに比べて実際の利点はありませんeval
。キャッシングは物事をスピードアップする可能性がありますが、実際には、このことに関するすべてのサイトはすでに非常に高速であるため、この時点で速度を最適化する必要はないと思います。
質問
このリストにあるもののそれぞれについて:それは良い考えですか?より良い代替案を考えられますか?
- 一般的なアイデア全体(html / phpのカスタムタグ)
- 直接処理するのではなく、タグをphpコードに変換する
- スタックベースのアプローチ
eval
(または同様の)の使用
読んでくれてありがとう、アドバイスをくれたTIA。:)