2011-02-03 112 views
2

Smarty 3及其新词法分析器令人兴奋不已,而作为模板设计人员可以为您提供多大的权力,但是当它实际上碰到货架时,它是真是令人失望,它有多慢。从头开始编写模板在Smarty 3中花费了一秒多,而Smarty 2中的相同模板花费了大约半秒。不好。基于XML的模板引擎与Smarty词法分析器

但它确实让我想到,为什么当PHP中已经有DOMDocument,SimpleXML等模块可用时,需要在PHP中实现全面的语言解析器?

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

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

回答

3

关于Smarty的问题,IIRC Smarty使用“编译模板”,所以如果你提到的性能问题只在“编译阶段”才会成为一个争议点 - 每个模板只编译一次,此后模板内容是从(快得多)缓存输出。

使用XML解析器的问题在于,HTML并不总是格式良好的XML。即使你使用有效的XHTML,你也可以跳过箍环来支持HTML实体,然后你会发现像嵌入式JavaScript等角落案例。(在一个侧面说明,IMO这是HTML5的最大的失败 - 它不反对所有传统的SGML废话并坚持使用格式良好的XML,如果HTML委员会这样做了,那么未来的模板引擎会更容易使用标准XML API编写)。我前段时间编写了一个XML-based template engine,它使用XMLReader API ,但为了使它与HTML一起工作,您必须将条目添加到您的Libxml系统目录中。这样做效果不错,但是很痛苦,大多数人会放弃并使用更简单的东西。

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标签,这看起来像是XML工具的文本。

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

+0

没有学习曲线是好的,但保证良好的形态也很好。我知道phptal提供了后者,我知道php本身不。 – kojiro 2013-02-06 21:29:37