被包含文件开头或结尾的空白字符(含空格、换行、BOM)会被原样输出,导致页面空白、JSON解析失败或headers already sent错误;纯PHP文件应省略?>且保存为UTF-8无BOM。

include 文件本身开头或结尾有空格会直接输出
PHP 的 include 是“原样嵌入执行”,只要被包含文件的 PHP 代码块外存在任何可见字符(包括空格、制表符、换行符),这些内容都会作为响应体的一部分发送出去。
典型表现是:页面顶部或两个区块之间多出一行空白,JSON 接口返回前带空格导致解析失败,header() 调用报 “headers already sent” 错误。
- 常见位置:被包含文件最顶部
<?php前有空行或 BOM; - 最底部
?>后有多余换行或空格; - 甚至
include语句所在行前后有空格,也可能因模板混合 HTML 导致渲染异常(尤其在echo前后混写时)。
include 语句写法中的空格不影响包含行为但影响可读性
include 本身是语言结构,不是函数,所以 include 'a.php' 和 include('a.php') 都合法,但后者容易让人误以为是函数调用——而它其实不接受括号参数(括号仅作分组用途,无实际语义)。
更关键的是:无论你写 include 'a.php'; 还是 include 'a.php';(中间多个空格),PHP 都能正常解析并加载文件。空格在这里不触发错误,也不改变行为。
立即学习“PHP免费学习笔记(深入)”;
- 但团队协作中应统一风格,推荐用
include 'a.php';(关键字后一个空格,路径紧贴); - 避免写成
include( 'a.php' ),括号内前后加空格既无必要,又和 PSR-12 对function()的紧凑要求冲突,易引发代码审查争议。
真正危险的是被 include 的文件末尾用了 ?> 并留了空格
这是最隐蔽也最常踩的坑。一旦被包含文件以 ?> 结尾,且后面跟着换行或空格,这些字符就会在 include 执行点被立即输出。
例如:a.php 写成:
<?php return ['name' => 'test']; ?> <-- 这里有一个看不见的换行符 -->
那么 include 'a.php'; 就会在返回数组的同时,悄悄输出一个换行。
- 解决方案:所有纯 PHP 文件(无 HTML 混排)一律省略
?>结尾; - 如果必须保留,确保
?>是文件最后一字节,后面**绝对不能有任何字符**(编辑器需设为“显示不可见字符”来检查); - 用
ob_start()包裹include可临时兜底,但属于掩盖问题,不解决根源。
UTF-8 BOM 会导致 include 后凭空多出 \uFEFF 字符
很多编辑器(尤其是 Windows 下的旧版 Notepad、Dreamweaver)保存 UTF-8 文件时默认加 BOM。BOM 在 PHP 中不被识别为注释,而是作为字面量输出,表现为响应开头的乱码或空白。
现象:Chrome 开发者工具 Network 标签中看到响应体开头是 {"data":...},JSON.parse 报错;或者页面 前多一个空行。
- 检测方法:用
hexdump -C a.php | head查看前几个字节,若为ef bb bf即含 BOM; - 修复方式:用 VS Code、Sublime 或 Notepad++ 打开,编码选 “UTF-8 without BOM” 重新保存;
- CI/CD 中可用
find . -name "*.php" -exec sed -i '1s/^\xEF\xBB\xBF//' {} \;批量清除(慎用,先备份)。
BOM 和末尾空格这两类问题不会报语法错误,却会让输出污染变得难以定位——它们总在你调试接口或布局时突然冒出来,而且只在特定环境(比如上线后用不同编辑器保存过文件)才复现。



















