2

好的,所以 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 的速度,那将不胜感激)

我正在谈论的完整示例:

前端页面.php:

<html>

<head>

<title> %1$s </title>

</head>

<body>

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

</body>

</html>

不管什么.php:

ob_start();

include frontpage.php;

$ob_output = ob_get_clean();

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

4

3 回答 3

6

如果您想要廉价的 PHP 模板,请使用带有 PHP 表达式块的单独文件。可以使用printf-style 格式字符串制作模板系统,但我可以看到这种方法存在两个主要问题:速度和可读性。这些printf函数旨在用于较短的字符串,虽然我手头没有任何统计数据,但我认为可以肯定地说,在一个表示页面正文的大字符串上运行 asprintf()或 avprintf()将比仅使用 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函数在处理较小的字符串格式化任务方面要好得多。

于 2009-05-08T09:10:07.813 回答
3

我一般有两个文件:

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

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

视图文件基本上看起来像这样:

<html>
<head>
<title><?=$title ?></title>
</head>
etc...
于 2009-05-08T15:18:33.927 回答
1

PHP 的创建者 Rasmus Lerdorf 更喜欢将他的变量包含在如下内容中:

    <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;
?>

作为参考,<<<EOBthroughEOB;是一个heredoc

资料来源:Rasmus Lerdorf的无框架 PHP MVC 框架

于 2009-05-08T15:19:41.723 回答