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