有很多关于Smarty 3及其新词法分析器的兴奋,以及它作为模板设计师会给你带来多大的力量,但是当它真正上架时,它真的令人失望,它有多缓慢。从头开始编译模板在Smarty 3中花了一秒多的时间,而Smarty 2中的相同模板需要大约半秒钟。不好。
但它确实让我思考,为什么你需要在PHP中实现一个完整的语言解析器,因为它已经有像DOMDocument,SimpleXML等可用的模块?
是否有基于XML扩展和/或DOMDocument的PHP模板引擎?如果是这样,性能如何?如果没有,那么有人试图写一个吗?
我可以预见的一个缺点是它只对基于XML的格式(如XHTML和RSS)有用。为了生成其他输出(非XML HTML,纯文本,CSS等),它可能会有很大问题,但我相信你可以用CDATA块来绕过它。使用XML / DOM进行模板解析是否有任何其他影响,我没有考虑过?
答案 0 :(得分: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 :(得分:1)
以下是我所知道的一些基于XML的模板引擎:
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)?>
类似于{$person.name|ucfirst}
在一个普通的PHP模板中。它使用PHP开发人员已知的语法,这意味着没有学习曲线,没有编译步骤,没有需要部署的引擎,没有渲染模板的运行时开销等等。