3

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

,谢谢

PS 我不想使用现有的模板引擎,例如 smarty,我想构建自己的。

4

5 回答 5

14

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

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

PHP 是一种模板语言。我认为人们忘记了这一点,或者试图将其视为纯 OO 语言,但事实并非如此。发挥 PHP 的优势。不要试图让它不是它的东西。

说了这么多,很难回答你的问题,因为你没有说你的模板系统有多简单或复杂,即你打算支持哪些功能。

如果您的模板语言相对简单,那么正则表达式可能是要走的路。但是,这不适用于一些琐碎的情况。控制结构的嵌套可能是最常见的。在这种情况下,您需要编写某种形式的基本解析器。

假设您所有的模板结构都在这样的块中:

{:...:}

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

您需要扫描文件以查找此类表达式并相应地处理它们。正则表达式可用于查找所有但不一定匹配的,例如条件包含,例如:

{:if ...:}
Some conditional content
{:endif:}

为什么?因为这:

{:if *some condition*:}
{:if *some other condition*:}
Some other conditional content
{:endif:}
Some conditional content
{:endif:}

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

于 2009-04-26T01:17:27.817 回答
5

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

PS:我测试了一个名为 PHPTAL(模板属性语言)的模板引擎。我喜欢它,因为您可以创建带有嵌入自定义 html 属性中的逻辑的 html 模板,而不会破坏设计。

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

于 2009-04-26T00:25:11.967 回答
1

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

因此,如果您真的必须自己构建,那么我想到了 3 个选项...

  1. 作为初学者,我通过自定义解析(strpos、substr 等)做了一些模板化。它非常缓慢,不优雅且容易出错。我不建议这样做。

  2. 正则表达式混乱。如果您不擅长正则表达式,请忘记它。但这可能是更快的方法之一。

  3. 也许您可以将某些东西与php tokenizer 函数一起使用...

  4. DOM扩展!使您的模板与 xhtml 兼容并将它们作为 xml 文件加载。哇,所有的解析都为你完成了!现在你有了一个带有自定义标签的漂亮树,比如


      <loop item="$myVariable" times="$x">
        <print name="$myVariable->name" entities="yes" nl2br="yes" purify="removeemptytags, xss"/>
        <hr/>
      </loop>

已经看起来有点像聪明了,恕我直言。您只需要进行一些解释(回显循环节点 $x 次的子节点),或者将其转换为 php 并缓存它(聪明的这样做是为了提高性能)。

或者,如果您更喜欢注释,类似这样的内容(但在这里您必须进行比使用自定义标签更多的解析)


    <!-- begin loop:myVariable -->
      <-- print:myVariable->name() -->
      <hr/>
    <!-- end loop -->

我无法想象 DOM 方法会非常快,但是如果您真的需要 moar 速度,则转换为本地 php 代码和/或缓存呈现的 html 会更好(如果速度真的那么重要,请不要编写您的自己的代码。除非你可能是 carmack 或 skeet)。

祝你好运。

于 2009-04-27T13:06:36.667 回答
0

You would require to implement parsers. But instead of parsing it each time do what Smarty and others do save the parsed output for later use. It would be even better if output of your parser is PHP code itself.

于 2009-04-26T02:17:52.163 回答
0

...我试图将我的演示文稿和逻辑分开,但我正在做的事情需要大量的逻辑通过 html 代码......

嘿,有这个……

为什么不给我们一个你想要做什么的例子呢?也许它会让我们了解您的情况为何如此特殊,也许对于您的问题类型有特殊的解决方案?只是说,我想写一个模板引擎,什么是最好、最快的方法并没有多大帮助。说真的,如果我想要更好的东西,我会选择其中的一些,看看他们做了什么,了解他们为什么这样做,学习并做一些不同的事情。

于 2009-04-25T23:58:49.720 回答