0

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

2 回答 2

0

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

于 2013-02-10T06:21:30.980 回答
0

ob_start()手册:

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

因此,假设 anob_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>
于 2013-02-10T10:05:04.250 回答