PHP:<<< vs ob_start

Jed*_*edi 7 php buffering

在PHP中有时候我会看到:

$html = <<<HTML
<p>Hello world</p>
HTML;
Run Code Online (Sandbox Code Playgroud)

通常我会使用ob_start():

ob_start();
?>
<p>Hello world</p>
<?php
$html = ob_get_contents();
ob_clean();
Run Code Online (Sandbox Code Playgroud)

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

Alv*_*ong 8

$html = <<<HTML
<p>Hello world</p>
HTML;
// equivalent:
$html = "<p>Hello world</p>";
Run Code Online (Sandbox Code Playgroud)

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


<?php
ob_start();
?>
<p>Hello world</p>
<?php
$html = ob_get_clean();
Run Code Online (Sandbox Code Playgroud)

这是完全不同的事情.它利用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));
Run Code Online (Sandbox Code Playgroud)

我还使用输出缓冲功能,这样我可以在顶部包含一个文件,最后我没有任何PHP,我可以创建一个简单的模板系统,但这有点偏离主题.


Mar*_*jan 6

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

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