require 文件错误时中止脚本,include 仅警告并继续执行;相对路径以当前执行脚本目录为基准,非工作目录;推荐用 DIR 拼接绝对路径;require_once 和 include_once 按完整路径字符串去重。

include 和 require 的行为差异必须分清
两者都用于加载外部 PHP 文件,但错误处理逻辑完全不同:require 在文件不存在或语法错误时会触发 Fatal error 并中止脚本;include 则只抛出 Warning,后续代码仍会执行。实际项目中,框架初始化、配置文件、核心类库一律用 require,避免静默失败。
相对路径以当前执行脚本为基准,不是当前工作目录
PHP 不读取 shell 的 pwd,而是以正在运行的 PHP 脚本(比如 index.php)所在目录为起点解析相对路径。这意味着:
-
include 'config/db.php'是从index.php所在目录拼接config/db.php - 如果通过 CLI 运行
php /var/www/app/cli.php,那相对路径就基于/var/www/app/ -
getcwd()返回的是当前工作目录,和 include 路径无关,别混淆
用 __DIR__ 拼接路径最安全,避免依赖 include_path
硬写相对路径容易因调用层级变深而失效;改 include_path 又影响全局且不易追踪。推荐统一用 __DIR__(当前文件所在目录的绝对路径)构建路径:
include __DIR__ . '/../config/database.php'; require_once __DIR__ . '/lib/Helper.php';
注意:__DIR__ 结尾不含斜杠,手动加 /;dirname(__FILE__) 功能等价但更冗长,已不推荐。
立即学习“PHP免费学习笔记(深入)”;
require_once 和 include_once 防重复加载,但判断依据是文件路径字符串
它们不是按文件内容去重,而是对「已加载过的完整路径字符串」做哈希比对。这意味着:
-
require_once 'foo.php'和require_once './foo.php'会被视为两个不同文件 - 软链接路径与真实路径也被认为不同,可能意外重复加载
- 如果用了
__DIR__拼接,基本可杜绝误判,但要注意符号链接场景下需用realpath()归一化
生产环境所有类文件引入务必用 require_once,否则可能引发 Cannot redeclare class 错误。
