纯PHP文件应省略结束标签“?>”,以避免结尾空白导致输出异常;混合PHP与HTML时需确保“?>”后无任何空白字符,这是PHP官方及PSR-12规范推荐做法。

PHP结束标签本身不产生空行,但紧随其后的空白字符(比如换行、空格、制表符)会被原样输出,导致浏览器看到多余空行或HTTP头发送异常。真正要避免的不是“怎么加”,而是“要不要加”以及“加了之后怎么处理”。
推荐做法:纯PHP文件省略结尾标签
如果一个PHP文件只包含PHP代码,没有HTML或其他内容,结尾不要写>。
- 好处:彻底杜绝因结尾换行、空格引发的意外输出
- 示例正确写法:
<?php echo "Hello"; return true; // 文件到这里就结束,不写 ?>
这是PHP官方建议,也是PSR-12等主流编码规范明确要求的。
必须保留结束标签时:确保后面零空白
仅在混合PHP与HTML的场景下才需要?>,比如模板文件:
立即学习“PHP免费学习笔记(深入)”;
- 结束标签
?>必须紧贴最后一行代码,后面不能有任何字符(包括换行) - 错误写法(会产生空行):
<?php echo "content"; ?> <!-- 这里有个换行,会被输出 -->
- 正确写法(无换行、无空格):
<?php echo "content"; ?><!-- 紧挨着,后面直接跟HTML或文件结束 -->
检查和修复已有文件的小技巧
用编辑器显示空白字符(如VS Code开启“渲染空白符”),重点检查:
- 文件末尾是否有多余空行
-
?>后是否有空格、Tab或不可见Unicode字符 - 保存时是否启用了“自动在文件末尾添加换行符”(应关闭)
终端快速检测命令(Linux/macOS):
tail -n 2 yourfile.php | cat -A
若看到$符号前有空格或^M,说明存在隐藏空白。
输出缓冲可临时缓解,但不解决根本问题
虽然ob_start()能捕获意外输出,但它只是掩盖问题:
- 无法防止header()调用失败(因为缓冲启动前可能已输出)
- 增加内存开销,且让调试更困难
- 属于补救手段,不是编码规范
真正可靠的方案,是源头控制——该省则省,该清则清。



















