PHP: <<<和ob_start的区别

8
在PHP中有时会看到这个:
$html = <<<HTML
<p>Hello world</p>
HTML;

通常我会使用ob_start():
ob_start();
?>
<p>Hello world</p>
<?php
$html = ob_get_contents();
ob_clean();

你能告诉我这两种向缓冲区写入数据的方式之间的区别及其优点吗?


5
我认为HEREDOC显然更加简洁。这也不是“不同的向缓冲区写入内容的方式”。HEREDOC是引用字符串的一种方式。ob_是一种捕获输出的方法,可以说是一个技巧,在数据输出之前进行处理。 - deceze
1
同意deceze的观点,大多数使用ob_*函数指向不良设计。话说heredoc在控制器或模型中都表现为“视图层”。 - Mike B
@MikeB 这也意味着“嘿,给我钱再雇一个程序员!” - jave.web
1
@deceze @MikeB 这个帖子 指出,在模板系统中,使用 ob_* 是很常见的,因为 HEREDOCS 无法正常工作。 - Ulad Kasach
2个回答

8
$html = <<<HTML
<p>Hello world</p>
HTML;
// equivalent:
$html = "<p>Hello world</p>";

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


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

这是完全不同的东西。它利用PHP输出缓冲控制来捕获不在PHP代码块内的内容。就像在给定的例子中,<p>Hello world</p>写在PHP代码块外面,应该立即输出到客户端。启用输出缓冲后,它们被存储在PHP的缓冲区中,因此可以使用ob_get_contents()ob_get_clean()稍后检索。如果需要插入任何PHP变量,则需要使用<?=$blah?>或甚至<?php echo $blah?>
一些CMS使用输出缓冲控制函数来管理内容和模块。一个例子是Joomla。这种设计的优点在于,每当模块需要将内容放置到其保留空间时,它可以简单地使用echo使内容可用。这可以简化从模块获取内容的方式,无需实现特定的函数调用或分配给特定变量,这使得系统更易于管理。
<?php
ob_start();
include dirname(__FILE__)."/content.php";
$content = ob_get_clean();
output_document(array("body"=>$content));

我还利用输出缓冲函数,这样我就可以在页面顶部包含一个文件,并且不需要在末尾加上任何PHP代码,就能够创建一个简单的模板系统。但是这有点偏题了。

Joomla在使用它吗?谢谢信息 - 现在我真的知道使用输出缓冲将HTML存储在变量中是一种糟糕的设计 :) (对我来说,Joomla似乎太混乱/设计不良 :) ) - jave.web

6

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

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


1
谢谢大家。我明白了。HEREDOCs 适用于简单的 HTML 模板,而 ob_start(),ob_get_contents() 会获取它们之间的所有内容。 - Jedi

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接