PHP开发基础知识:dirname(__DIR__)

luby 学习笔记 2026-07-01 22:45 43 阅读

从新学习PHP中dirname(__DIR__)的含义

dirname(__DIR__)是PHP开发中非常常用的写法,作用是‌获取当前代码文件所在目录的‌ ‌上级父目录的绝对路径‌,我们从基础到用法拆分理解:

1. 各部分的作用拆解
__DIR__是PHP的魔术常量:它会返回当前代码文件‌所在磁盘目录的绝对路径‌,是编译期解析的固定值,不受运行时工作目录变化影响,比dirname(__FILE__)更简洁高效
dirname()是PHP的路径处理函数:它的作用是从传入的路径中,提取出去掉最后一级后的父目录路径(默认向上回退1级,PHP 7+支持通过第二个参数指定回退层级)
所以dirname(__DIR__)就是对当前目录路径执行一次向上回退,拿到父目录路径。

2. 举个实际例子
如果你的代码文件放在:D:\Apache\htdocs\worklog\api\upload.php
那么:

__DIR__会得到:D:\Apache\htdocs\worklog\api
dirname(__DIR__)会向上回退一级,最终得到:D:\Apache\htdocs\worklog,正好是你之前场景里需要的项目根目录。
3. 常用场景
这个写法最常见的用途就是‌从子目录的代码文件向上推导项目根目录‌,比如:
你的项目结构:

worklog          // 项目根目录
├─ upload        // 你需要访问的目标目录
└─ api           // 代码所在的子目录
  └─ upload.php // 当前代码文件
在upload.php中直接写dirname(__DIR__) . '/upload/detail/'就能拿到正确的项目根下目标路径,避免当前代码所在目录带来的拼接错误。

4. 扩展用法(PHP 7及以上)
如果你需要回退多级目录,可以直接使用dirname的第二个参数指定层级,不需要多次嵌套调用:
比如要回退2级目录,不用写dirname(dirname(__DIR__)),可以简化为:

// 直接指定回退2级,等价于两次嵌套dirname,写法更简洁
$grandpaDir = dirname(__DIR__, 2);

5、再说一下dirname(__FILE__)

(1). 各部分含义
__FILE__是PHP的魔术常量,它会返回‌当前代码文件的完整绝对路径(包含文件名本身)‌,哪怕这个文件被其他文件包含/引入,它也始终返回自身的完整路径,不会随引入文件的位置改变。
dirname()是PHP的路径处理函数,作用是从传入的路径中提取出目录部分,去掉最后的文件名。
所以dirname(__FILE__)就是从当前文件的完整路径中,去掉文件名,最终得到当前文件所在目录的绝对路径。

(2). 和dirname(__DIR__)的关系
其实__DIR__是PHP 5.3之后才引入的简写语法糖,它等价于dirname(__FILE__),两者结果完全一致,只是__DIR__写法更简洁:

表格
写法    等价关系    适用PHP版本
__DIR__    直接等于dirname(__FILE__)    PHP 5.3+
dirname(__FILE__)    无简写    所有PHP版本
简单来说,dirname(__FILE__)是旧写法,在新版本PHP中已经可以用更简短的__DIR__替代了,效果完全一样。