2

Smarty 3 和它的新词法分析器以及它会给你作为模板设计师的更多功能带来了很多令人兴奋的事情,但是当它真正上架时,它的速度有多慢真是令人失望。在 Smarty 3 中从头开始编译模板需要一秒钟多的时间,而在 Smarty 2 中编译相同的模板大约需要半秒钟。不好。

但这确实让我想到,当 PHP 已经有 DOMDocument、SimpleXML 等可用的模块时,为什么还需要在 PHP 中实现一个成熟的语言解析器?

是否有任何基于 XML 扩展和/或 DOMDocument 的 PHP 模板引擎?如果有,表现如何?如果没有,那么有没有人试图写一个?

我可以预见的一个缺点是它只对基于 XML 的格式(如 XHTML 和 RSS)真正有用。对于生成其他输出(非 XML HTML、纯文本、CSS 等),它可能会产生很大的问题,但我相信您可以使用 CDATA 块解决它。使用 XML/DOM 进行模板解析还有其他我没有考虑过的含义吗?

4

2 回答 2

3

关于您关于 Smarty 的观点,IIRC Smarty 使用“编译模板”,因此如果您提到的性能问题仅在“编译阶段”成为一个有争议的问题 - 每个模板只编译一次,此后模板内容从 (much更快)缓存。

使用 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 的模板引擎还有其他论据。就个人而言,我不喜欢混合两种不同的标签语法的想法,其中一种(Smarty)不能使用普通的 XML 工具进行解析、处理或验证。澄清一下,是的,您可以解析 Smarty 模板的 XML 部分,但您不能解析或修改 Smarty-tags,它们看起来像 XML 工具的文本。

反对自定义语法(例如在 Smarty 和大多数其他模板引擎中使用的)的另一个常见论点是 PHP 已经为这些模板引擎提供的所有内容提供了语法——例如,<?=ucfirst($person->name)?>类似于{$person.name|ucfirst}普通 PHP 模板中的语法。它使用 PHP 开发人员已知的语法,这意味着没有学习曲线、没有编译步骤、没有需要部署的引擎、没有运行时渲染模板的开销等。

于 2011-09-11T19:44:38.363 回答