2

Smarty 3 とその新しいレクサー、およびそれがテンプレート デザイナーとしてどれだけ多くの機能を提供するかについては多くの興奮がありましたが、実際にそのまま棚に置かれたとき、その遅さに本当にがっかりしました。テンプレートを最初からコンパイルするのに Smarty 3 では 1 秒以上かかりましたが、Smarty 2 では同じテンプレートを約 0.5 秒かかりました。良くない。

しかし、DOMDocument、SimpleXML などのモジュールが既に利用可能な PHP で、本格的な言語パーサーを実装する必要があるのはなぜでしょうか?

XML 拡張や DOMDocument に基づく PHP 用のテンプレート エンジンはありますか? もしそうなら、パフォーマンスはどのようなものですか?そうでない場合、誰かがそれを書き込もうとしましたか?

私が予見できる欠点の 1 つは、XHTML や RSS などの XML ベースのフォーマットでしか実際に役に立たないことです。他の出力 (非 XML HTML、プレーン テキスト、CSS など) を生成する場合、かなり問題になる可能性がありますが、CDATA ブロックで回避できると確信しています。テンプレートの解析に XML/DOM を使用することで、私が考慮していない他の影響はありますか?

4

2 に答える 2

3

Smarty についてのあなたの指摘では、IIRC Smarty は「コンパイルされたテンプレート」を使用するため、言及したパフォーマンスの問題が「コンパイル フェーズ」のみにある場合は論点になります。高速) キャッシュ。

XML パーサーを使用する際の問題は、HTML が常に整形式の XML であるとは限らないことです。有効な XHTML を使用している場合でも、HTML エンティティをサポートするためにフープをジャンプすることになる可能性があり、埋め込み Javascript などのまれなケースを見つけることができます (ちなみに、IMO これは HTML5 の最大の失敗です。旧式の SGML はすべてがらくたであり、整形式の XML を使用することを主張しています. HTML 委員会がこれを行っていた場合、将来のテンプレート エンジンは標準の XML API を使用して作成する方がはるかに簡単になるでしょう.) 私はXML ベースのテンプレート エンジンを少し前に書きました. XMLReader API を使用しますが、HTML で動作させるには、Libxml システム カタログにエントリを追加する必要があります。これは十分に機能しますが、面倒です。ほとんどの人はあきらめて、もっと単純なものを使用します。

于 2011-02-03T19:15:02.503 に答える
1

以下は、私が知っている XML ベースのテンプレート エンジンの一部です。

http://phptal.org/

http://code.google.com/p/querytemplates/

http://www.hyperkit-software.com/projects/phptemplates/index.html

パフォーマンスに関しては、ほとんどの XML ベースのテンプレート エンジンがコンパイル フェーズで大幅に高速化されているとは思いません。PHP 用の最新のテンプレート エンジンのほとんどはコンパイルを使用するため、コンパイラのパフォーマンスは通常、より拡張性と保守性の高いエンジンを優先して犠牲にされます。コードベース、およびより最適化されたコンパイル済みテンプレートの生成。Robin が指摘したように、テンプレートはコンパイルされるため、コンパイル フェーズがどれほど速いか遅いかは誰も気にしません。

ただし、XML ベースのテンプレート エンジンには別の議論があります。個人的には、通常の XML ツールを使用して解析、処理、または検証できない 2 つの異なるタグ構文 (Smarty) を混在させるという考えは嫌いです。明確にするために、はい、Smarty テンプレートの XML 部分を解析できますが、XML ツールにとってテキストのように見える Smarty タグを解析または変更することはできません。

カスタム構文 (Smarty や他のほとんどのテンプレート エンジンで使用されるものなど) に対するもう 1 つの一般的な議論は、PHP には、これらのテンプレート エンジンが提供するすべての構文が既に存在するというものです。たとえば、プレーンな PHP テンプレート<?=ucfirst($person->name)?>と同様です。{$person.name|ucfirst}これは、PHP 開発者に既に知られている構文を使用します。つまり、学習曲線、コンパイル手順、展開する必要のあるエンジン、テンプレートをレンダリングするためのランタイム オーバーヘッドなどはありません。

于 2011-09-11T19:44:38.363 に答える