如何检查在php中是否回显了某些内容?
问题描述:
我正在开发一个基于一些自定义CMS的项目,其中当我打电话时,CMS模块将返回显示块。这些块是使用我在不同文件中定义的自定义函数绘制的。当然,ob_start()
已用于CMS本身以保留输出字符串。现在,正如我所看到的,只有在满足某些条件(例如日期)时,才会绘制一些内部块(由CMS模块调用的函数绘制)。因此,在某些情况下,由于被调用函数没有任何回声,因此只绘制块的外部包装(div
)。现在,我想通过检查函数是否回应某些东西来编辑该模块。我的问题是,我不能使用这样的事情:如何检查在php中是否回显了某些内容?
$temp = ob_get_contents();
ob_flush();
ob_start();
eval(trim($block->detail));//this is where custom function is called in module
$block = ob_get_contents();
ob_flush();
ob_start();
echo $temp;
if($block)
{
echo $start.$block.$end;//$start and $end contains div wrapper html
}
的原因是,这VIEW
模块称为相同的组件内多次绘制根据不同的条件块。像上面所做的那样,多次绘制以前回显的html(在调用视图模块之前)。我仍然坚持如何避免同一个html的多次回显。 我知道这个问题有点复杂,但任何帮助将非常感激。
答
我会在这里写一个真实的答案。 就像我说的,你可以将多个ob_start()嵌套在一起。
检查php.net手册:http://php.net/manual/en/function.ob-start.php 发出警告消息后。
输出缓冲区是可堆叠的,也就是说,您可以在另一个ob_start()处于活动状态时调用ob_start()。只要确保你调用了ob_end_flush()适当的次数。如果多个输出回调函数处于活动状态,则将按照嵌套顺序依次对输出进行过滤。
所以,你的代码可能是:
ob_start();
eval(trim($block->detail));
$block = ob_get_contents();
ob_end_clean();
if($block){
echo $start.$block.$end;
}
而这一切,你不必停止并重新启动输出缓冲器。
编辑:
或者你甚至可以离开ob_end_clean()
(http://php.net/manual/en/function.ob-get-clean.php)
像这样:
ob_start();
eval(trim($block->detail));
$block = ob_get_clean();
if($block){
echo $start.$block.$end;
}
您不必刷新之前的OB _...,你可以将多个ob_start()一起嵌套! – Gerifield 2014-09-06 12:29:50
会跳过缓冲已经缓冲的通用输出吗? – Sayed 2014-09-06 12:30:57
是的! http://php.net/manual/en/function.ob-start.php “输出缓冲区是可堆叠的,也就是说,当另一个ob_start()处于活动状态时,您可以调用ob_start(),只要确保调用ob_end_flush ()适当的次数,如果多个输出回调函数处于活动状态,那么输出将按照嵌套顺序依次过滤。“ – Gerifield 2014-09-06 12:31:27