在PHP中,我有时会看到:
$html = <<<HTML
<p>Hello world</p>
HTML;
通常我会使用ob_start():
ob_start();
?>
<p>Hello world</p>
<?php
$html = ob_get_contents();
ob_clean();
你能告诉我这两种写入缓冲区的方法之间有什么区别吗?
答案 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标头中的数据。)