8

在 PHP 中,有时我会看到:

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

通常我会使用 ob_start() :

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

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

4

2 回答 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?>or 甚至<?php echo $blah?>.


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

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

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

于 2012-11-19T14:23:25.950 回答
6

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

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

于 2012-11-19T14:18:20.083 回答