【问题标题】:PHP: <<< vs ob_startPHP:<<< vs ob_start
【发布时间】:2012-11-19 14:10:58
【问题描述】:

在 PHP 中有时我会看到:

$html = <<<HTML
<p>Hello world</p>
HTML;

通常我会使用 ob_start() :

ob_start();
?>
<p>Hello world</p>
<?php
$html = ob_get_contents();
ob_clean();

你能告诉我这两种写入缓冲区的方式有什么区别以及它们的优点吗?

【问题讨论】:

  • 我会说HEREDOCs显然更干净。它也不是“写入缓冲区的不同方式”。 HEREDOC 是一种引用字符串的方式。 ob_ 是一个,我敢说,在任何输出消失之前破解它。
  • 同意 deceze,ob_* 函数的大多数使用都指向糟糕的设计。然后再次在控制器或模型中尖叫“视图层”。
  • @MikeB 它还尖叫着“Heeey 给我钱给另一个编码器!”
  • @deceze @MikeB this thread 指出 ob_* 的使用在模板系统中很常见,HEREDOCS 无法工作。

标签: php buffering


【解决方案1】:
$html = <<<HTML
<p>Hello world</p>
HTML;
// equivalent:
$html = "<p>Hello world</p>";

这使用PHP string Heredoc syntax,这是一种编写字符串的语法,类似于使用单引号和双引号,但以某种不同的方式转义。可以使用{}直接插入一些PHP字符串。


<?php
ob_start();
?>
<p>Hello world</p>
<?php
$html = ob_get_clean();

这是完全不同的事情。它利用PHP output buffering control 来捕获PHP 代码块中 的内容。就像在给定的示例中一样,&lt;p&gt;Hello world&lt;/p&gt; 写在 PHP 代码块之外,它应该立即输出到客户端。启用输出缓冲后,它们将存储在 PHP 中的缓冲区中,以便以后可以使用 ob_get_contents()ob_get_clean() 检索它。如果需要插入任何 PHP 变量,则需要使用&lt;?=$blah?&gt; 甚至&lt;?php echo $blah?&gt;


一些 CMS 使用输出缓冲控制功能来管理内容和模块。一个例子是 Joomla。这种设计的好处是,每当模块需要将内容放置到其预留空间时,它可以简单地使用echo 来使内容可用。这可以简化从模块中获取内容的方式,无需实现特定的函数调用或分配给特定的变量,从而使系统更易于管理。

<?php
ob_start();
include dirname(__FILE__)."/content.php";
$content = ob_get_clean();
output_document(array("body"=>$content));

我还使用了输出缓冲函数,这样我就可以在顶部包含一个文件,并且最后不需要任何 PHP,我可以创建一个简单的模板系统,但这有点离题了。

【讨论】:

  • Joomla 正在使用它吗?感谢您提供的信息 - 现在我真的知道使用输出缓冲将 html 存储在变量中是一个糟糕的设计 :) (Joomla 对我来说似乎太乱/太糟糕了:))
【解决方案2】:

HEREDOC (&lt;&lt;&lt;) 只是将字符串数据写入变量的另一种方式。另一方面,输出缓冲区将捕获在ob_start() 之后发生的所有输出,包括在调用ob_get_contents() 之前您可能在代码中出现的任何警告或错误的(HTML)输出;

通常,如果您只需要使用 HTML 格式化字符串,只需使用 HEREDOC 或常规字符串表示法。如果您需要在发送任何 HTTP 标头之前捕获输出,通常使用输出缓冲区(例如,如果您使用 FirePHP 来调试您的应用程序,您将需要使用输出缓冲,因为 FirePHP 将日志数据嵌入到HTTP 标头)。

【讨论】:

  • 谢谢你们。我明白了。 HEREDOCs 适用于简单的 HTML 模板,而 ob_start()、ob_get_contents() 可以抓取两者之间的所有内容。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-05-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-03-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多