Php 输出缓冲,分层?

Php 输出缓冲,分层?,php,apache,output-buffering,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

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>';
    }
}
?>

老实说,我看这没什么问题。对ob_start()的每个调用都与ob_get_clean()调用匹配,因此此类函数的使用对“父”ob_start()完全透明。如果成对(对ob_start()和ob_get_clean()的调用)不匹配,这将是一个可怕的习惯——但只要它们匹配,就不会(也不会)给您带来任何麻烦。

手册:

输出缓冲区是可堆叠的,也就是说,您可以在 另一个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>
ob_start();
回声“;
ob_start();
回声“;
$inner=ob_get_clean();//
回声“;
$outer=ob_get_clean();//