【问题标题】:ob_get_contents + ob_end_clean vs ob_get_cleanob_get_contents + ob_end_clean 与 ob_get_clean
【发布时间】:2013-07-22 16:33:00
【问题描述】:

这两个PHP有什么区别吗?

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

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

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

【问题讨论】:

  • 有一个 PHP 错误使它们的工作方式不同,您可以查看我的答案。

标签: php


【解决方案1】:

回答你的问题:

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】:

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!';

【讨论】:

    【解决方案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_contentsob_end_clean的文档中没有类似的句子。

    如果您真的想确定这些函数之间没有进一步的区别(没有),您可以深入了解源代码中ob_get_contentsob_end_cleanob_get_clean 的定义。对于 ob_get_clean 中的不可能的情况,有一些奇怪的错误处理,这些情况永远不会达到,但除此之外,您可以看到这些行为与描述的一样。

    【讨论】:

      【解决方案4】:

      根据文档,

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-12-11
        • 1970-01-01
        • 2013-01-18
        • 1970-01-01
        • 1970-01-01
        • 2011-11-14
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多