PHP函数返回false时如何移除函数内所有已输出内容
问题根因
PHP执行是线性流,当你在函数中混写HTML时,代码运行到HTML片段的位置就会直接将内容输出到响应流,后续执行的return false逻辑不会回溯撤销已经送出的输出内容,因此即便函数返回false,之前输出的<div><a>Hello</a></div>依然会展示给用户。
实现方法
使用PHP原生输出控制(Output Control)函数拦截函数执行过程中的所有临时输出,最终根据返回结果决定是丢弃还是放行输出,逻辑流程如下:
- 进入函数后第一时间开启输出缓冲,拦截后续所有直接输出的内容
- 正常执行原函数的业务逻辑、输出逻辑,记录最终返回结果
- 若结果为空/返回false,直接清空缓冲区中暂存的所有输出,不对外渲染
- 若结果符合预期,将缓冲区暂存的内容正常输出即可
修正后的可运行代码:
function myfunction($result){ // 开启输出缓冲,拦截后续所有输出 ob_start(); ?> <div><a>Hello</a></div> <?php if(empty($result)) { // 清空缓冲区暂存的所有内容,丢弃之前生成的输出 ob_end_clean(); return false; } // 校验通过,输出缓冲区内容并关闭缓冲 ob_end_flush(); return true; }
相关函数说明
ob_start():启动输出缓冲,调用后该语句后的所有输出不会直接发送到客户端,而是存入内部缓冲区ob_end_clean():清空内部缓冲区的全部内容,同时关闭当前输出缓冲层ob_end_flush():将内部缓冲区存储的内容输出到响应流,同时关闭当前输出缓冲层
注意:如果php.ini中开启了全局
output_buffering配置,要注意缓冲层级匹配,避免误清空其他逻辑产生的输出。
内容的提问来源于stack exchange,提问作者kovrita is The life
相关产品推荐
相关产品推荐

