这两个PHP之间有什么区别吗?
ob_start();
//code...
$pageContent = ob_get_contents();
ob_end_clean();
someFunction($pageContent);
Run Code Online (Sandbox Code Playgroud)
VS
ob_start();
//code...
$pageContent=ob_get_clean();
someFunction($pageContent);
Run Code Online (Sandbox Code Playgroud)
我目前正在使用第一个块,但我想使用第二个块,如果它在功能上是等效的,因为它更简洁一点.
Ama*_*ali 27
回答你的问题:
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 - 获取当前缓冲区内容并删除当前输出缓冲区
您将缓冲区内容存储到变量中,然后删除输出缓冲区.
你所做的基本上是一样的.因此,我认为在这里使用第二个代码块没有任何问题,因为它们都在做同样的事情.
ob_get_contents() 可用于继续输出缓冲.
例:
ob_start();
echo 'Something!';
$html1 = ob_get_contents();
echo 'More to say!';
$html2 = ob_get_contents();
ob_end_clean();
Run Code Online (Sandbox Code Playgroud)
最后,vars有这样的内容:
$html1 = 'Something!';
$html2 = 'Something!More to say!';
Run Code Online (Sandbox Code Playgroud)
之间有一个微小的区别
$stuff = ob_get_clean();
Run Code Online (Sandbox Code Playgroud)
和
$stuff = ob_get_contents();
ob_end_clean();
Run Code Online (Sandbox Code Playgroud)
也就是说,E_NOTICE如果在您调用它时没有活动的输出缓冲区,后者将抛出一个,而前者则不会。抛出通知实际上对我来说似乎是更明智的行为,因为如果您在没有输出缓冲区的情况下调用这些函数,那么您可能做错了什么!
php.net 上明确记录了这两种方法几乎等效,其中说:
ob_get_clean()本质上同时执行ob_get_contents()和ob_end_clean()。
的警告投掷行为ob_end_clean是还记载:
如果函数失败,它会生成一个
E_NOTICE.
请注意,ob_get_contents或的文档中没有类似的句子ob_end_clean。
如果您真的想确保自己在这些函数之间没有进一步的区别(没有),您可以深入了解ob_get_contents,ob_end_clean和ob_get_clean源代码中的定义。对于不可能发生的情况,有一些奇怪的错误处理,ob_get_clean永远不会达到,但除此之外,您可以看到行为如所描述的那样。