2012-11-19 137 views
7

在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(); 

你能告诉我,这两者之间有什么区别写入缓冲区的方式及其优点?

+5

我想说,HEREDOCs显然是更清洁。这也不是“写入缓冲区的不同方法”。 HEREDOCs是*引用字符串*的一种方式。我敢说,'ob_'是一种可以在任何输出消失之前捕捉到的输出。 – deceze

+1

同意欺骗,大多数使用'ob_ *'函数指向糟糕的设计。然后HEREDOC再次在控制器或模型中尖叫“视图层”。 –

+0

@MikeB它也尖叫“Heeey给我钱给另一位编码员!” –

回答

6

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

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

+1

谢谢你们。我明白了这一点。 HEREDOCs适用于简单的HTML模板,而ob_start(),ob_get_contents()则可以抓取所有内容。 – Jedi

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,但这是有点无关。

+0

谢谢你的解释:-)真的内容丰富! – Jedi

+0

Joomla正在使用它?感谢您的信息 - 现在我真的知道使用outputbuffering在变量中存储html是一个糟糕的设计:)(Joomla似乎太杂乱/糟糕的设计:)) –