【问题标题】:Cheap php templating with vprintf?使用 vprintf 进行廉价的 php 模板?
【发布时间】:2010-10-24 17:48:27
【问题描述】:

好的, 所以 printf/sprint/vprintf 都接受某种类型说明符语法 %[num][type]。 (http://us2.php.net/sprintf 参见示例 3 和 4)其中 num 是类型的索引。

示例: vprintf('数字 %1$d 字符串 %2$s. 字符串 %2$s, 数字 %1$d',array(1,"no"));

是的,它是有限的……而且您需要维护索引。但它是该语言的原生语言,而且(我认为)速度很快。

我只是想了解一下这对第二阶段的用处有多大用处:http://www.techfounder.net/2008/11/18/oo-php-templating/

(如果有人知道 printf/vprintf 的速度,将不胜感激)

我正在谈论的完整示例:

frontpage.php:

<html>

<head>

<title> %1$s </title>

</head>

<body>

Hello %2$s! You have reached page: %1$s!

</body>

</html>

whatever.php:

ob_start();

include frontpage.php;

$ob_output = ob_get_clean();

vprintf($ob_output,"Page Title","Bob");

【问题讨论】:

  • "echo" 比 "print" 快 "echo" 接受多个参数,你可以用它来代替字符串连接alexatnet.com/node/196
  • 我正在谈论的完整示例:frontpage.php:<html> <head> <title> %1$s </title> </head> <body> Hello %2$s! You have reached page: %1$s! </body> </html>whatever.php:ob_start(); include frontpage.php $ob_output = ob_get_clean(); vprintf($ob_output,"Page Title","Bob");
  • ... 好的,所以反引号在 cmets 中不起作用。对不起。
  • 我想重申这不会是模板的主要来源。这将是替换键字符串等的第二阶段。techfounder.net/2008/11/18/oo-php-templating我喜欢这种模板方式,它会完成繁重的工作。

标签: php function templates templating


【解决方案1】:

如果您想要廉价的 PHP 模板,请使用带有 PHP 表达式块的单独文件。可以使用printf 样式的格式字符串制作模板系统,但是我可以看到这种方法存在两个主要问题:速度和可读性。 printf 函数旨在用于较短的字符串,虽然我手头没有任何统计数据,但我认为可以肯定地说,在一个代表页面正文的巨大字符串上运行 sprintf()vprintf()会比只在文件中使用 PHP 表达式块要慢。

这就引出了下一个问题:可读性。比较这两个 HTML 模板:

<html>
<head>
   <title>%s</title>
</head>
<body>
<div id="main">
    <h1>%s</h1>
    <p>%s</p>
</div>
<div id="other">
    <p>%s</p>
</div>
<p id="footer">
    %s. Took %.2f seconds to generate.
</p>
</body>
</html>

<html>
<head>
   <title><?= $title ?></title>
</head>
<body>
<div id="main">
    <h1><?= $header ?></h1>
    <p><?= $body_text ?></p>
</div>
<div id="other">
    <p><?= $misc_info ?></p>
</div>
<p id="footer">
    <?= $copyright ?>. Took <?= $load_time ?> seconds to generate.
</p>
</body>
</html>

或者,假设我决定使用带有索引参数的格式字符串。说,像这样:

<h1>%1$s</h1>
<p>%2$s</p>
<span id="blah">%3$s</p>
<p>%4$s</p>
<p>%5$s</p>

现在,如果我想改变顺序怎么办?

<h1>%1$s</h1>
<p>%3$s</p>
<span id="blah">%5$s</p>
<p>%4$s</p>
<p>%2$s</p>

这些显然是人为的,但想想从长远来看如何维护printf 模板。

因此,一般来说,如果您想要快速而简单的 PHP 模板,请使用包含 PHP 表达式块的模板文件。 printf 函数在处理较小的字符串格式化任务方面要好得多。

【讨论】:

  • PHP 是一种模板语言,不妨按照 htw 的建议使用它。
  • @synthos:抱歉,我没有意识到 PHP 有这个功能。固定。
  • 是的,我真正想知道的是,如果您对大字符串执行 vprintf,您会采取什么样的性能冲击。
【解决方案2】:

我一般有两个文件:

  • 某种控制器(recipes.controller.php 重写为 /recipes/123)
  • 控制器的多个视图之一 (recipes.view.html)

我只是在控制器中完成所有逻辑/数据库工作,然后在最后包含适当的视图。视图可以访问控制器中的所有变量,因此我已经创建了 $title、$ingredients[] 等内容。我不太确定为什么人们让它比这更复杂。这很容易理解。

视图文件基本上是这样的:

<html>
<head>
<title><?=$title ?></title>
</head>
etc...

【讨论】:

    【解决方案3】:

    Rasmus Lerdorf,PHP 的创建者,更喜欢将他的变量包括在内:

        <select class="f" name="cat" id="f_cat" size="1">
          <option selected>Category</option>
    <?php foreach($categories as $cat) echo <<<EOB
          <option value="{$cat}">{$cat}</option>
    
    EOB;
    ?>
    

    作为参考,&lt;&lt;&lt;EOBEOB;heredoc

    来源:The no-framework PHP MVC Framework Rasmus Lerdorf

    【讨论】:

    • 不能说我是heredoc的忠实粉丝。
    猜你喜欢
    • 1970-01-01
    • 2014-08-21
    • 1970-01-01
    • 1970-01-01
    • 2010-10-04
    • 2016-02-07
    • 1970-01-01
    • 1970-01-01
    • 2011-11-05
    相关资源
    最近更新 更多