pathinfo()是纯字符串解析函数,不访问文件系统;返回值取决于参数:不传时返回含dirname等四键的数组,传常量则返回对应字符串;无法正确解析URL或Windows反斜线,且不处理路径规范化。

直接说结论: pathinfo() 是个纯字符串解析函数,不访问文件系统,也不校验路径是否存在;它只按规则切分输入的字符串,返回目录、文件名、扩展名等字段——用错场景或传入非法路径时,结果可能和你预期完全不符。
pathinfo() 返回什么,取决于你传了什么参数
不传第二个参数时,它返回一个数组,含 dirname、basename、extension、filename 四个键(extension 和 filename 在无扩展名时可能缺失);传了 PATHINFO_DIRNAME 这类常量,则直接返回对应字符串。
-
pathinfo('/a/b/c.txt')→ 数组,['dirname' => '/a/b', 'basename' => 'c.txt', 'extension' => 'txt', 'filename' => 'c'] -
pathinfo('/a/b/c.txt', PATHINFO_EXTENSION)→ 字符串'txt' -
pathinfo('/a/b/.hidden')→['dirname' => '/a/b', 'basename' => '.hidden', 'filename' => ''](点开头被当扩展名,filename为空) -
pathinfo('noext')→ 没有extension键,访问$arr['extension']会触发Undefined index
别拿 pathinfo() 解析 URL 或带查询参数的路径
它把 http://example.com/a.php?x=1 当作普通路径处理:dirname 是 http://example.com,basename 是 a.php?x=1 ——这不是你想要的“路由路径”。真正该用的是 parse_url() 先拆出 path,再对 path 调用 pathinfo()。
- 错误写法:
pathinfo("http://site.com/index.php?k=v")→basename变成index.php?k=v - 正确流程:
$url = parse_url($str); $path = $url['path']; $parts = pathinfo($path); - Windows 路径中反斜线
\默认不被识别为分隔符(除非在 Windows 系统上运行且 locale 设置正确)
pathinfo() 和 dirname()/basename() 的关键区别
dirname() 和 basename() 是单职责函数,只返回目录或文件名部分;pathinfo() 一次调用能拿到全部字段,但开销略高,且行为更复杂(比如对点开头文件、多级扩展名的处理逻辑不同)。
立即学习“PHP免费学习笔记(深入)”;
-
basename('/a/b/.gitignore')→'.gitignore'(原样返回) -
pathinfo('/a/b/.gitignore')['basename']→ 同样是'.gitignore',但filename为空、extension为'gitignore'(注意:这是陷阱) -
pathinfo('a.tar.gz')→extension是'gz',filename是'a.tar'(只剥最后一个点) - 若需兼容多扩展名(如
.tar.gz),得自己用explode('.', $basename)手动处理
最易被忽略的一点:它不处理路径规范化。传入 /a/../b,它不会自动转成 /b;要绝对路径请先用 realpath(),再喂给 pathinfo()。否则,dirname 可能返回 /a/.. 这种无效段。



















