ob_get_contents + ob_end_clean vs ob_get_clean

chi*_*NUT 26 php

这两个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 - 获取当前缓冲区内容并删除当前输出缓冲区

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


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

  • 谢谢!我认为它是一样的,只是确保我不会无意中改变幕后发生的特殊事情. (2认同)

jor*_*jor 9

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)


Mar*_*ery 7

之间有一个微小的区别

$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_cleanob_get_clean源代码中的定义。对于不可能发生的情况,有一些奇怪的错误处理,ob_get_clean永远不会达到,但除此之外,您可以看到行为如所描述的那样。