include 文件不存在时仅触发 e_warning 警告,脚本继续执行;require 则抛出 e_compile_error 并终止执行,适用于关键依赖;路径含 . 或 .. 时 ignore include_path,推荐用 dir 拼绝对路径。

include 文件不存在时只报 Warning,脚本继续执行
这是最常被误解的一点:include 不会中断程序。它触发的是 E_WARNING 级别错误,PHP 会输出类似 Warning: include(): Failed opening 'missing.php' for inclusion 的提示,但后续代码照常运行。
常见错误现象:
- 页面底部突然多出一长串警告信息,但主体内容仍能显示
- 调试时发现变量未定义、函数找不到,却没意识到是 include 失败后脚本“假装没事”继续跑下去了
- 在生产环境关闭了错误显示(
display_errors = Off),结果缺失文件导致逻辑错乱,却无任何日志线索
require 才会真正 halt 脚本,适合关键依赖
如果你包含的是数据库配置、核心类定义或路由入口这类不能缺的文件,必须用 require。它失败时抛出 E_COMPILE_ERROR,直接终止执行,避免后续代码在残缺环境中运行出不可预知的结果。
使用场景对比:
-
require 'config/database.php'—— 配置文件缺失,整个应用不该启动 -
include 'templates/footer.php'—— 页脚挂了,主内容还能展示,用户体验略降但服务不瘫 -
require_once 'vendor/autoload.php'—— Composer 自动加载器必须存在,否则所有类都找不到
路径写法决定 include_path 是否生效
很多人以为设置了 include_path 就万事大吉,其实只要路径里带 . 或 ..(比如 ./lib/helper.php 或 ../shared/init.php),PHP 就完全忽略 include_path,只按相对路径解析——而这个“当前目录”其实是 getcwd() 返回的工作目录,不是文件所在目录。
安全又可控的做法:
- 用
__DIR__拼绝对路径:require __DIR__ . '/config/db.php'; - 避免裸文件名(如
include 'db.php'),它会依次查include_path→ 当前脚本目录 → 工作目录,顺序多、耗时、不可控 - 部署时若用 chdir() 切换工作目录,裸名和点路径行为会突变,极易出错
include_once / require_once 不是万能保险
它们只防“同一请求内重复包含”,不防“文件根本不存在”。也就是说:include_once 'missing.php' 依然会报 Warning,且之后再调一次 include_once 'missing.php' 还是同样报错——因为第一次就没成功注册到已包含列表里。
真正容易被忽略的点:
- 错误日志里看到多次相同 Warning,别急着加
_once,先确认文件路径对不对、权限够不够、大小写是否匹配(Linux 下敏感) -
require_once在 CLI 模式下跨进程不共享状态,每次执行都是新上下文,所以它防重载只在单次请求生命周期内有效 - 如果通过 symlink 链接文件,注意 PHP 的 open_basedir 或 realpath cache 可能导致路径解析失败
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











