如何检查是否在php中回显了某些内容?

时间:2014-09-06 12:17:50

标签: php echo buffering ob-start

我正在开发一个基于某个自定义CMS的项目,其中当我调用CMS时,CMS的模块会返回显示块。这些块是使用我在不同文件中定义的自定义函数绘制的。当然,CMS本身已经使用ob_start()来保存输出字符串。现在,正如我所看到的,一些内部块(由CMS模块调用的函数绘制)仅在满足某些条件(例如,日期)时被绘制。因此,在某些情况下,只绘制块(div)的外包装,因为被调用的函数没有回应。现在,我想通过检查函数是否回声来编辑该模块。我的问题是我不能使用这样的东西:

     $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的多次回声。 我知道这个问题有点复杂,但任何帮助都会非常感激。

1 个答案:

答案 0 :(得分:0)

我会在这里写一个真正的答案。 就像我说的,你可以将多个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;
}