首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >最好的PHP 5模板技术?

最好的PHP 5模板技术?
EN

Stack Overflow用户
提问于 2009-04-25 23:42:26
回答 5查看 7.3K关注 0票数 3

我希望在php中建立自己的模板层作为我的OOP框架的一部分,但我正在寻找如何正确做到这一点的一些例子。我希望避免解析每个html文件来找到告诉模板引擎要做什么的注释,而是使用更快/更干净/更现代的技术。我只需要一些例子,因为我使用谷歌环顾四周,没有任何东西引起我的注意。我试图将我的表示和逻辑分开,但我所做的事情需要大量的逻辑来处理html代码。

,谢谢

附注:我不想使用像smarty这样的现有模板引擎,我想建立自己的模板引擎。

EN

回答 5

Stack Overflow用户

发布于 2009-04-26 01:17:28

我会问你同样的问题,就像我问任何建议Smarty的人一样:

PHP是一种模板语言,为什么要添加模板语言呢?

PHP是一种模板语言。我认为人们忘记了这一点,或者试图把它当作一种纯粹的面向对象语言,which it isn't。发挥PHP的优势。不要试图让它变成不是的东西。

话虽如此,很难回答你的问题,因为你没有说出你的模板系统有多简单或多复杂,也就是你打算支持什么功能。

如果您的模板语言相对简单,那么可以使用正则表达式。然而,对于一些微不足道的情况,这是行不通的。控制结构的嵌套可能是最常见的。在这种情况下,您需要编写某种形式的初级解析器。

假设所有的模板结构都是这样的块:

代码语言:javascript
运行
复制
{:...:}

因为这种情况在HTML页面中发生的可能性相对较小(尽管,为了完整性,您需要满足用户确实想要使用这些字符组合的情况。

您需要扫描文件中的此类表达式,并对其进行相应的处理。正则表达式可以用来查找它们,但不一定是匹配的,例如for conditional includes:

代码语言:javascript
运行
复制
{:if ...:}
Some conditional content
{:endif:}

为什么?因此:

代码语言:javascript
运行
复制
{:if *some condition*:}
{:if *some other condition*:}
Some other conditional content
{:endif:}
Some conditional content
{:endif:}

将其与正则表达式进行匹配是不可靠的,因此您需要将文件解析为某种形式的词位树,然后对其进行处理。

票数 14
EN

Stack Overflow用户

发布于 2009-04-26 00:25:12

您是否考虑过模型-视图-控制器模式?您可以使用函数和变量(控制器内部)抽象所有逻辑,并将它们公开给视图。这可能是模板化的第一步。

附言:我测试了一个叫做PHPTAL (模板属性语言)的模板引擎。我喜欢它,因为您可以在不破坏设计的情况下,创建具有嵌入到自定义html属性中的逻辑的html模板。

我希望这些想法对你有所帮助。

票数 5
EN

Stack Overflow用户

发布于 2009-04-27 13:06:37

最快的方法是使用php本身,因为php是一种模板语言。当然,有时出于安全考虑,这并不是一个好的选择,而且设计师必须学习基本的php (这真的很痛苦)。有时,它也会变得非常丑陋,而其他更专业(更不强大)的模板系统可以保持它的整洁。

所以,如果你真的要构建你自己的,我有3个选择…

  1. 作为一个初学者,我通过自定义解析(strpos、substr等)进行了一些模板化。它非常慢,不优雅,而且容易出错。我不推荐这样做。
  2. 正则表达式混乱。如果您不擅长使用正则表达式,那就算了吧。但这可能是更快的方法之一。
  3. 也许你可以和php tokenizer functions一起路径一些东西...
  4. DOM-extension!使您的模板与xhtml兼容,并将其作为xml文件加载。哇,所有的解析都已经为你完成了!现在,您已经有了一个很好的树,其中有两个自定义标记,比如

代码语言:javascript
运行
复制
      <loop item="$myVariable" times="$x">
        <print name="$myVariable->name" entities="yes" nl2br="yes" purify="removeemptytags, xss"/>
        <hr/>
      </loop>

已经看起来有点像聪明人了,小家伙。您只需要做一些解释(回显循环节点的子节点$x次),或者可能将其转换为php并缓存(出于性能考虑,smarty会这样做)。

或者,如果你更喜欢注释,就像这样(但在这里你必须做比使用定制标签更多的解析)

代码语言:javascript
运行
复制
    <!-- begin loop:myVariable -->
      <-- print:myVariable->name() -->
      <hr/>
    <!-- end loop -->

我无法想象DOM方法会很快,但如果你真的需要更快的速度,转换成原生php代码和/或缓存呈现的html会更好(如果速度真的是那么重要,不要写你自己的代码。除非你是carmack或者skeet )。

祝好运。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/789944

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档