这两个PHP之间有什么区别吗?
ob_start();
//code...
$pageContent = ob_get_contents();
ob_end_clean();
someFunction($pageContent);
VS
ob_start();
//code...
$pageContent=ob_get_clean();
someFunction($pageContent);
我目前正在使用第一个块,但我想使用第二个块,如果它在功能上是等效的,因为它更简洁一点。
答案 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_contents
或ob_end_clean
的文档中没有类似的句子。
如果你真的想确保自己在这些功能之间没有进一步的区别(没有),你可以深入研究ob_get_contents
,ob_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 。