dirname(__file__) 返回当前 php 文件所在目录的绝对路径,不含末尾斜杠;__dir__ 是其更优替代,性能更好且语法简洁,拼接时须显式添加斜杠。

dirname(__FILE__) 返回的是什么路径
它返回的是当前 PHP 文件所在目录的**绝对路径**,不含末尾斜杠。比如 /var/www/html/app,不是 /var/www/html/app/,也不是相对路径 ./app。这点很关键——include 和 require 接收的是文件路径,而 PHP 在解析时对路径末尾斜杠敏感,尤其拼接时容易漏掉。
include(dirname(__FILE__) . '/config.php') 为什么有时报错
常见错误是路径拼接后指向了不存在的文件,比如:
-
dirname(__FILE__)在 symlink(符号链接)环境下可能返回链接目标路径,而非调用位置路径,导致include找不到同级文件 - 拼接时忘了加
/,写成dirname(__FILE__) . 'config.php'→ 变成/var/www/htmlappconfig.php(路径粘连) - 在 CLI 模式下运行时,
__FILE__是脚本自身路径,但工作目录可能不同,依赖getcwd()的写法会失效,而dirname(__FILE__)不受干扰,这点反而是优势
更安全的写法:用 __DIR__ 替代 dirname(__FILE__)
__DIR__ 是 PHP 5.3+ 引入的魔术常量,语义等价于 dirname(__FILE__),但性能更好(无需函数调用),且写起来更简洁、不易拼错。所有现代项目应优先用它。
典型用法示例:
// 引入同级目录的 db.php include __DIR__ . '/db.php'; // 引入上一级目录的 bootstrap.php include __DIR__ . '/../bootstrap.php'; // 引入子目录中的类 include __DIR__ . '/lib/Cache.php';
注意:__DIR__ 结尾**没有斜杠**,所以拼接时必须显式加上 /;如果用 dirname(__FILE__) . '/' 多加一个斜杠,会导致双斜杠(如 /path//file.php),多数系统能容忍,但某些严格环境或 NFS 挂载点会出问题。
include 路径不生效?检查 open_basedir 和文件权限
即使路径拼对了,include 仍失败,大概率是底层限制:
-
open_basedir配置禁止访问__DIR__所在路径外的区域(例如设为/var/www/html,但__DIR__是/tmp/app) - Web 服务器用户(如 www-data)无权读取目标文件,
ls -l看权限,特别注意父目录也要有x权限才能进入 - Windows 下大小写不敏感,Linux 下
Config.php≠config.php,容易因命名不一致静默失败
调试时可先用 file_exists() 验证路径是否真实存在:var_dump(file_exists(__DIR__ . '/config.php')); —— 这比直接 include 更早暴露路径问题。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











