require出错时直接终止脚本执行,触发E_COMPILE_ERROR级错误,PHP解释器立即中止整个脚本,后续代码均不执行;include仅抛E_WARNING,脚本继续运行但隐患隐蔽;require_once在文件已加载时跳过,否则同require终止执行。

require出错时直接终止脚本执行
是的,require 在找不到文件、语法错误或权限不足等场景下,会触发 E_COMPILE_ERROR 级别错误,PHP 解释器立刻中止整个脚本,后续任何代码(包括 echo、return、try 块外的语句)都不会执行。
这不是“跳过”或“忽略”,而是进程级中断——你甚至看不到空白页之后的调试输出。常见现象是:页面突然空白,浏览器无响应,错误日志里只有一行 Fatal error: require(): Failed opening required 'xxx.php'。
include 为什么看起来“更友好”
include 出错时只抛 E_WARNING,脚本继续往下走。比如:
include 'missing.php'; echo 'Hello'; // 这行仍会输出
但它带来的隐患更隐蔽:变量未定义、函数不存在、类加载失败,可能在后续几行才暴露为 Notice 或 Fatal error,排查路径变长。
立即学习“PHP免费学习笔记(深入)”;
用 @include 抑制警告不解决根本问题,反而掩盖了加载失败的事实。
require_once 和重复包含的边界情况
require_once 同样会终止脚本,但多了一层判断:如果该文件已被 require、include、require_once 或 include_once 加载过,就跳过——不会报错,也不会重复执行。
注意几个易错点:
-
require_once 'config.php'和require_once './config.php'被视为两个不同路径,可能重复加载 - 符号链接、大小写混用(尤其在 macOS/Linux)、
open_basedir限制都可能导致“明明加载过了却还报错” - 推荐统一用
require_once __DIR__ . '/config.php',避免路径解析漂移
什么时候该用 require 而不是 include
核心判断标准只有一个:这个文件是否参与当前请求的必要逻辑链?
以下场景必须用 require 或 require_once:
- 核心类库(如
Database.php、Router.php) - 配置文件(
database.php、env.php),缺失会导致后续全部失效 - 初始化脚本(
bootstrap.php),含自动加载、常量定义等
而 include 更适合非关键路径:统计埋点、可选皮肤模板、A/B 测试片段。但即便如此,也建议先用 file_exists() 显式检查,而不是依赖 include 的容错机制。
最常被忽略的是:require 的终止行为在 CLI 模式下同样生效,且不会输出 HTML 错误提示——它直接退出进程,日志里只剩一条致命错误。



















