绝对路径更可靠,因其以当前文件目录为基准,不受执行入口影响;相对路径易出错,因PHP始终以入口脚本所在目录为基准解析,导致包含失败或路径错位。

绝对路径更可靠,尤其在多层嵌套包含或项目结构变动时;相对路径看似简单,但极易因执行入口不同而失效。
为什么相对路径在 include/require 中容易出错
PHP 解析相对路径时,**始终以入口脚本(如 index.php)所在目录为基准**,而不是当前被包含文件的目录。这意味着:./config.php 在 a/b/c.php 里写,实际找的是 入口目录/config.php,不是 a/b/config.php。
- 常见错误现象:
Warning: include(../lib/db.php): failed to open stream,但文件明明就在上一级 - 典型场景:入口是
/public/index.php,它include '../app/Router.php',而Router.php内部又include 'Config.php'—— 这个Config.php会去/public/Config.php找,不是/app/Config.php - 参数差异:
include 'file.php'(无点无斜杠)和include './file.php'都算相对路径,但前者还会触发include_path查找,后者不会
用 __DIR__ 拼接绝对路径是最稳妥的做法
__DIR__ 是当前文件所在目录的绝对路径字符串,不依赖执行上下文,拼接时注意分隔符和层级。
- 推荐写法:
include __DIR__ . '/../config/database.php'; - 避免硬编码分隔符:Windows 下用
\、Linux 用/,但 PHP 允许统一用/;若需严格兼容,可用DIRECTORY_SEPARATOR - 别漏掉点号:
__DIR__ . '../config.php'(少了个.)会导致路径粘连成类似/var/wwwapp/config.php,直接失败 - 性能影响:无实质开销,
__DIR__是编译期常量,比dirname(__FILE__)略快且语义更清晰
$_SERVER['DOCUMENT_ROOT'] 适合 Web 入口级路径,慎用于深层逻辑
$_SERVER['DOCUMENT_ROOT'] 指向 Web 服务器配置的文档根目录(如 /var/www/html),属于绝对路径,但有明显限制。
立即学习“PHP免费学习笔记(深入)”;
- 使用场景:在
/public/index.php或模板文件中加载公共资源,比如include $_SERVER['DOCUMENT_ROOT'] . '/inc/header.php'; - 兼容性风险:CLI 模式下该变量可能不存在或为空,必须先判断:
isset($_SERVER['DOCUMENT_ROOT']) - 容易踩的坑:项目部署在子目录(如
http://example.com/myapp/)时,DOCUMENT_ROOT仍是服务器根,不是应用根,会导致路径错位 - 不建议在
/app/或/src/内部文件中使用它来加载同项目其他类——这时应优先用__DIR__向上追溯
最麻烦的不是写错一次路径,而是某个 include 在开发时正常,上线后因部署方式(如软链接、子目录、CLI 调用)导致路径解析完全偏移;__DIR__ 能锁死每个文件的“立足点”,这是相对路径永远做不到的。



















