33

这两个PHP有什么区别吗?

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

对比

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

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

4

4 回答 4

35

要回答您的问题:

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

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


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

于 2013-07-22T16:47:27.140 回答
11

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!';
于 2013-07-22T16:34:40.973 回答
8

之间有一个微小的区别

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

于 2016-01-30T13:12:03.707 回答
1

根据文档,

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 版本。

于 2019-05-28T18:41:23.623 回答