【问题标题】:PHP templating with str_replace?PHP模板与str_replace?
【发布时间】:2010-10-03 09:45:38
【问题描述】:

我认为 PHP 模板系统的基本原理是字符串替换,对吧? 那么我可以只使用一个字符串来保存我的 html 模板代码,比如

$str_template = "<html><head><title>{the_title}</title><body>{the_content}</body></html>"

在下面的代码中,只需执行 str_replace 即可将数据推送到我的模板变量中,例如

str_replace( $str_template, '{the_title}', $some_runtime_generated_title );
str_replace( $str_template, '{the_content}', $some_runtime_generated_content );

最后

echo $str_template; 

这是否有望使整个变量传递过程更快一些?我知道这可能是一个奇怪的问题,但有人试过吗?

【问题讨论】:

    标签: php templates


    【解决方案1】:

    是的,这就是模板系统背后的基本理念。您可以进一步抽象它,例如让其他方法添加括号。

    您还可以将数组与 str_replace 一起使用,从而通过这样的一个函数调用进行更多替换

    str_replace(array('{the_title}', '{the_content}'), array($title, $content), $str_template);
    

    我使用的系统是Spoon Library,他们的模板系统非常稳定,包括编译后的模板,这是一个巨大的性能提升。

    【讨论】:

    • Spoon Lib 比 smarty 快吗?
    • 数组在这个函数中非常好。至于 smarty,几乎任何东西都是更快更好的选择。
    【解决方案2】:

    这通常是模板系统的基本思想。真正的模板系统具有更多功能,但核心是它们所做的。

    你问这是否会“使整个变量传递过程更快一点”。比什么快?您现在正在做的事情是否遇到性能问题?

    【讨论】:

    • 对不起,我的意思是比 Smarty 等常规模板方法更快。不,我没有遇到性能问题,只是好奇。谢谢。
    • 使用 Smarty 可能会比您建议的更有效。考虑到每次调用 str_replace() 时,对于每个要替换的变量,都必须扫描整个模板字符串以查找要替换的花括号。 Smarty 将更有效地执行该操作。
    • 哦,简单字符串替换的另一个困难是,如果您的 $some_runtime_generated_title 包含看起来像变量替换的内容,例如“{the_content} 去哪儿了?”会发生什么? {the_content} 的下一次替换也会错误地替换标题中的内容。
    • smarty 解析模板一次生成php代码。然后为每个请求执行 php 代码
    【解决方案3】:

    我会构建一个解析器,将代码分解成它的标记(变量和纯文本)。作为一种简单的方法,您可以使用 pre_split 函数来执行此操作:

    $tokens = preg_split('/(\{[^\}]+\})/', $string, -1, PREG_SPLIT_DELIM_CAPTURE);
    

    现在您可以迭代标记并检查它是变量还是纯文本:

    foreach ($tokens as $token) {
        if ($token[0] === '{' && $token[strlen($token)-1] === '}') {
            // token is a variable
        } else {
            // token is plain text
        }
    }
    

    这种方法的优点是变量不会在已经被替换的文本中被替换。所以:

    $foo = '{bar}';
    $bar = 'bar';
    $template = 'Lorem {foo} {bar} sit amet …';
    

    这里的文本将替换为Lorem bar {bar} sit amet … 而不是Lorem bar bar sit amet …,因为它会发生在您的代码中,当{bar}{foo} 之后被替换时。

    【讨论】:

      【解决方案4】:

      使用模板引擎是个好主意。

      但是当 html 较大时,您的想法会变慢,如果您需要更多变量,则会变慢。请记住,每个请求都会执行替换。

      您可以使用包含 php 标签的 html 文件进行输出(如 &lt;?=$var?&gt;)和循环。 通过“包含”将它们包含到您的 php 代码中。 这要快得多。

      看看smarty。这是我最喜欢的 php 模板引擎。 smarty 有很多不错的功能,比如缓存,并且可以通过插件扩展。

      如果您懂德语,请查看here。 smarty 有一个简短的介绍。

      【讨论】:

        【解决方案5】:

        当然,您需要以正确的顺序排列参数。 str_replace()

        将模板放在自己的文件中而不是将它们保存在字符串中也可能是个好主意。然后通过file_get_contents() 或类似方式阅读它们。

        【讨论】:

          【解决方案6】:

          如果你只做变量扩展,你可以这样做:

          $str_template = "<html><head><title>$the_title</title><body>$the_content</body></html>";
          

          它也会起作用...
          有几个人想知道,PHP已经是模板系统了,为什么还要有模板系统……

          当然,这些系统还有其他优点,比如更安全地访问变量,可能更容易被设计人员处理(或通过工具生成),视图层中的逻辑限制......这是一个常见的批评像 Smarty 这样的重型模板系统,具有如此多的逻辑,您几乎可以用它编写另一个模板系统! ;-)

          一些模板系统,比如Savant,走的是中间道路。 :-)

          【讨论】:

            【解决方案7】:

            您根本无法以这种方式制作模板。
            现实生活中的模板不仅需要填充简单的变量,还需要几个控制结构,或者至少需要某种块来控制页面的某些区域(例如制作循环)。
            因此,您不能仅使用 str_replace 制作模板。还需要一些正则表达式和复杂的解析。

            因此,最好坚持使用已经供您使用的模板引擎 - PHP 本身!

            【讨论】:

            • PHP 本身...最好的答案!
            【解决方案8】:

            其实“你的常识”的答案是正确的。您可以使用 PHP 来使用当前上下文并替换变量。您可以执行 ob_start() 将其保存在缓冲区中并获取替换的内容,而不是写入输出。轻松优雅!

            【讨论】:

              【解决方案9】:

              基本上这个想法是这样的,但是模板提供了更多的东西,例如 RainTPL 是所见即所得的,因为它用服务器路径替换模板中的相对路径,这样你就可以在本地设计模板并且它可以工作在服务器上无需更改 img/css。

              【讨论】:

                猜你喜欢
                • 2011-07-11
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2016-03-14
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                相关资源
                最近更新 更多