ob_get_contents + ob_end_clean vs ob_get_clean

时间:2013-07-22 16:33:00

标签: php

这两个PHP之间有什么区别吗?

ob_start();
//code...
$pageContent = ob_get_contents();
ob_end_clean();
someFunction($pageContent);

VS

ob_start();
//code...
$pageContent=ob_get_clean();
someFunction($pageContent);

我目前正在使用第一个块,但我想使用第二个块,如果它在功能上是等效的,因为它更简洁一点。

5 个答案:

答案 0 :(得分:26)

回答你的问题:

  

ob_get_clean()基本上执行ob_get_contents()和ob_end_clean()。

是。它功能相同。


案例1:

ob_get_contents() + ob_end_clean()

  

ob_get_contents - 返回输出缓冲区的内容

     

ob_end_clean - 清除(擦除)输出缓冲区并关闭输出缓冲

因此,基本上,您将输出缓冲区的内容存储到变量中,然后使用ob_end_clean()将其清除。

案例2:

  

ob_get_clean - 获取当前缓冲区内容并删除当前输出缓冲区

您将缓冲区内容存储到变量中,然后删除输出缓冲区。


你所做的基本上是一样的。所以,我认为在这里使用第二个代码块没有任何问题,因为它们都在做同样的事情。

答案 1 :(得分:9)

ob_get_contents()可用于继续输出缓冲。

示例:

ob_start();
echo 'Something!';
$html1 = ob_get_contents();
echo 'More to say!';
$html2 = ob_get_contents();
ob_end_clean();

最后,vars有这样的内容:

$html1 = 'Something!';
$html2 = 'Something!More to say!';

答案 2 :(得分:3)

之间有一个很小的区别
$stuff = ob_get_clean();

$stuff = ob_get_contents();
ob_end_clean();

如果在你调用它时没有活动的输出缓冲区,后者将抛出E_NOTICE,而前者不会。抛出通知实际上对我来说似乎是一种更为理智的行为,因为如果您在没有输出缓冲区的情况下调用这些函数,那么您可能做错了什么!

这两种方法几乎相同的是explicitly documented on php.net,它说:

  

ob_get_clean()基本上同时执行ob_get_contents()ob_end_clean()

ob_end_clean的警告投掷行为是also documented

  

如果函数失败,则会生成E_NOTICE

请注意,ob_get_contentsob_end_clean的文档中没有类似的句子。

如果你真的想确保自己在这些功能之间没有进一步的区别(没有),你可以深入研究ob_get_contentsob_end_clean和{{3}的定义在源头。对ob_get_clean中不可能的案例进行了一些奇怪的错误处理,但是除此之外,您还可以看到行为如上所述。

答案 3 :(得分:0)

  

ob_get_contents()+ ob_end_clean()

应该与以下相同:

  

ob_get_clean

但是,由于PHP错误,事实并非如此。 nextendweb的Roland提交了一个错误报告:

https://bugs.php.net/bug.php?id=76563

并建议使用:

$content = ob_get_contents();
ob_clean();

代替:

$content = ob_get_clean();

在沙盒上进行测试,您会注意到它会影响所有PHP版本。

ob_get_clean在我的登台网站上使用输出缓冲区破坏了一些插件。

答案 4 :(得分:-1)

ob_get_clean()函数执行 ob_get_contents() ob_end_clean()

ob_get_contents() + ob_end_clean()相同的功能, ob_get_clean()返回输出缓冲区的内容和结束输出缓冲。如果输出缓冲未激活,则返回 FALSE