在PHP有时我看到这一点:PHP:<<< VS ob_start
$html = <<<HTML
<p>Hello world</p>
HTML;
通常我会用ob_start():
ob_start();
?>
<p>Hello world</p>
<?php
$html = ob_get_contents();
ob_clean();
你能告诉我,这两者之间有什么区别写入缓冲区的方式及其优点?
在PHP有时我看到这一点:PHP:<<< VS ob_start
$html = <<<HTML
<p>Hello world</p>
HTML;
通常我会用ob_start():
ob_start();
?>
<p>Hello world</p>
<?php
$html = ob_get_contents();
ob_clean();
你能告诉我,这两者之间有什么区别写入缓冲区的方式及其优点?
HEREDOC(<<<
)是将字符串数据写入变量的另一种方法。另一方面,输出缓冲区将捕获在ob_start()
之后发生的所有输出,包括(HTML)输出在调用ob_get_contents()
之前代码中可能存在的任何警告或错误;
通常,如果您只需要使用HTML格式化字符串,只需使用HEREDOC或常规字符串表示法。如果您在发送任何HTTP标头之前需要捕获输出,通常会使用输出缓冲区(例如,如果您使用FirePHP来调试应用程序,则需要使用输出缓冲,因为FirePHP会将日志记录数据嵌入HTTP头)。
谢谢你们。我明白了这一点。 HEREDOCs适用于简单的HTML模板,而ob_start(),ob_get_contents()则可以抓取所有内容。 – Jedi
$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,但这是有点无关。
谢谢你的解释:-)真的内容丰富! – Jedi
Joomla正在使用它?感谢您的信息 - 现在我真的知道使用outputbuffering在变量中存储html是一个糟糕的设计:)(Joomla似乎太杂乱/糟糕的设计:)) –
我想说,HEREDOCs显然是更清洁。这也不是“写入缓冲区的不同方法”。 HEREDOCs是*引用字符串*的一种方式。我敢说,'ob_'是一种可以在任何输出消失之前捕捉到的输出。 – deceze
同意欺骗,大多数使用'ob_ *'函数指向糟糕的设计。然后HEREDOC再次在控制器或模型中尖叫“视图层”。 –
@MikeB它也尖叫“Heeey给我钱给另一位编码员!” –