PHP:<<< vs ob_start

时间:2012-11-19 14:10:58

标签: php buffering

在PHP中,我有时会看到:

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

通常我会使用ob_start():

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

你能告诉我这两种写入缓冲区的方法之间有什么区别吗?

2 个答案:

答案 0 :(得分:8)

$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代码块中的内容。与给定示例中一样,<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,我可以创建一个简单的模板系统,但这有点偏离主题。

答案 1 :(得分:6)

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

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