这两个PHP有什么区别吗?
ob_start();
//code...
$pageContent = ob_get_contents();
ob_end_clean();
someFunction($pageContent);
对比
ob_start();
//code...
$pageContent=ob_get_clean();
someFunction($pageContent);
我目前正在使用第一个块,但如果它在功能上等效,我想使用第二个,因为它更简洁一些。
这两个PHP有什么区别吗?
ob_start();
//code...
$pageContent = ob_get_contents();
ob_end_clean();
someFunction($pageContent);
对比
ob_start();
//code...
$pageContent=ob_get_clean();
someFunction($pageContent);
我目前正在使用第一个块,但如果它在功能上等效,我想使用第二个,因为它更简洁一些。
要回答您的问题:
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()
.
案例二:
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();
最后,变量具有以下内容:
$html1 = 'Something!';
$html2 = 'Something!More to say!';
之间有一个微小的区别
$stuff = ob_get_clean();
和
$stuff = ob_get_contents();
ob_end_clean();
也就是说,E_NOTICE
如果在您调用它时没有活动的输出缓冲区,后者将抛出一个,而前者不会。对我来说,抛出通知实际上似乎是一种更理智的行为,因为如果你在没有输出缓冲区的情况下调用这些函数,那么你可能做错了什么!
这两种方法几乎等效,在 php.net 上有明确记录,其中说:
ob_get_clean()
本质上同时执行ob_get_contents()
和ob_end_clean()
。
的警告投掷行为ob_end_clean
也被记录在案:
如果函数失败,它会生成一个
E_NOTICE
.
ob_get_contents
请注意, or的文档中没有类似的句子ob_end_clean
。
如果您真的想确保自己在这些函数之间没有进一步的区别(没有),您可以深入了解ob_get_contents
,ob_end_clean
和ob_get_clean
源代码中的定义。对于不可能的情况,有一些奇怪的错误处理,ob_get_clean
永远不会达到,但除此之外,您可以看到这些行为与描述的一样。
根据文档,
ob_get_contents()
+ob_end_clean()
应该与以下内容相同:
ob_get_clean()
但是,由于 PHP 中的一个错误,它没有。nextendweb 的 Roland 提交了一份错误报告:
https://bugs.php.net/bug.php?id=76563
如果您将 ob_start 与回调一起使用,则如果您在同一输出缓冲区上使用 ob_get_clean(),则回调不会运行。回调被跳过,这会产生意想不到的结果。我认为这是一个错误。
因此,如果您将回调传递给ob_start()
,则需要使用
$content = ob_get_contents();
ob_clean();
代替:
$content = ob_get_clean();
在沙盒上进行测试,您会注意到它会影响所有 PHP 版本。