输出缓冲,分层?

时间:2013-02-10 06:17:12

标签: php apache output-buffering

PHP中的输出缓冲非常有趣。它简化了许多事情。我在脚本的顶部使用ob_start(),在底部使用ob_get_clean()(或任何其他函数)。

在这两个调用之间,可以再次调用这些函数,而不会干扰父调用。

这种代码有效吗? (它工作正常,但......)这是一个好习惯吗?

<?php

ob_start(); //NOTICE !!!

echo '<p>echos of the top of the script</p>';
echo GetSomeOtherData(true);
echo '<p>echos after GetSomeOtherData()</p>';

$data = ob_get_clean(); //NOTICE !!!
echo $data;

//just a function to return something, with the help of output buffering
function GetSomeOtherData($toReturn)
{

    ob_start();     //NOTICE !!!
    echo '<p>This has been rendered inside a function</p>';
    $function_data = ob_get_clean();    //NOTICE !!!

    if($toReturn===true)
    {
        return $function_data;
    }
    else
    {
        //may be an error | return something else
        return '<p>An Error</p>';
    }
}
?>

2 个答案:

答案 0 :(得分:1)

老实说,我认为没有任何问题。每次对ob_start()的调用都与ob_get_clean()调用相匹配,因此使用这些函数对“父”ob_start()完全透明。如果对(对ob_start()和ob_get_clean()的调用不匹配 - 这将是一个可怕的习惯 - 但只要他们这样做,它就不应该(并且不会)给你带来任何麻烦。

答案 1 :(得分:1)

来自ob_start()手册:

  

输出缓冲区是可堆叠的,也就是说,您可以调用ob_start()   另一个ob_start()处于活动状态。只要确保你打电话   ob_end_flush()适当的次数。如果多输出   回调函数处于活动状态,输出按顺序进行过滤   通过嵌套顺序中的每一个。

因此,假设ob_end/get将结束/返回匹配的ob_start,例如:

,这是完全有效的。
ob_start();
  echo "<div class=outer>";
  ob_start();
    echo "<div class=inner></div>";
  $inner = ob_get_clean(); // <div class=inner></div>
  echo "</div>";
$outer = ob_get_clean();     // <div class=outer></div>