【问题标题】:How to check if something was echoed in php?如何检查是否在php中回显了某些内容?
【发布时间】:2014-09-06 12:17:49
【问题描述】:

我正在开发一个基于一些自定义 CMS 的项目,其中显示块在我调用它时由 CMS 的模块返回。这些块是使用我在不同文件中定义的自定义函数绘制的。当然,ob_start() 已在 CMS 本身中用于保存输出字符串。现在,正如我所见,某些内部块(由 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 的多次回显。 我知道这个问题有点复杂,但任何帮助都将不胜感激。

【问题讨论】:

  • 你不必刷新之前的ob_...,你可以将多个ob_start()嵌套在一起!
  • 会跳过缓冲已经缓冲的公共输出吗?
  • 是的! php.net/manual/en/function.ob-start.php "输出缓冲区是可堆叠的,也就是说,您可以在另一个 ob_start() 处于活动状态时调用 ob_start()。只要确保调用 ob_end_flush() 适当的次数即可。如果多个输出回调函数处于活动状态,则输出正在按嵌套顺序依次过滤它们中的每一个。”
  • 好的。让我检查一下。等一下。
  • 我已经回答了一些示例代码。

标签: php echo buffering ob-start


【解决方案1】:

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

【讨论】:

  • 让我检查一下.. 等一下。
  • 布局变得扭曲或者我可能遗漏了什么,所以我将其标记为答案.. :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-08-15
  • 1970-01-01
  • 2019-06-29
  • 2011-10-11
  • 2012-02-03
  • 2012-08-22
相关资源
最近更新 更多