PHP使用__DIR__时出现“无法打开流:无此文件或目录”错误求助
问题场景
当执行require_once __DIR__ . '/../vendor/autoload.php';加载自动加载文件时,PHP抛出如下错误:
Warning:
require_once(/Applications/MAMP/htdocs/crud_app/public/vendor/autoload.php):
Failed to open stream: No such file or directory in
/Applications/MAMP/htdocs/crud_app/public/index.php on line 6
执行echo __DIR__.'/../vendor/autoload.php';输出为/Applications/MAMP/htdocs/crud_app/public(注:此处输出疑似截断,实际计算路径应为/Applications/MAMP/htdocs/crud_app/vendor/autoload.php),但实际vendor目录位于/Applications/MAMP/htdocs/crud_app/controllers/目录下,正确路径为/Applications/MAMP/htdocs/crud_app/controllers/vendor/autoload.php。运行环境为PHP 8.1、macOS。
问题原因
- 路径计算与实际目录不匹配:
__DIR__代表当前脚本(public/index.php)的所在目录/Applications/MAMP/htdocs/crud_app/public,../表示回退到上一级目录(项目根目录/Applications/MAMP/htdocs/crud_app),原代码指向的是项目根目录下的vendor文件夹,但实际vendor被放在了controllers子目录中,导致目标路径不存在。 - 目录结构不符合PHP项目标准:Composer默认会将vendor目录生成在项目根目录,这是PHP生态的通用规范,当前vendor目录位置属于非标准配置。
解决办法
方法一:修正vendor目录位置(推荐)
遵循PHP项目标准结构,调整vendor目录位置:
- 将
/Applications/MAMP/htdocs/crud_app/controllers/vendor完整移动到项目根目录/Applications/MAMP/htdocs/crud_app/下。 - 保持原加载代码不变:
require_once __DIR__ . '/../vendor/autoload.php';,此时路径会正确指向/Applications/MAMP/htdocs/crud_app/vendor/autoload.php,问题即可解决。
方法二:修改加载路径(临时方案)
如果暂时无法调整目录结构,直接修改加载代码中的路径:
require_once __DIR__ . '/../controllers/vendor/autoload.php';
代码解释:从public目录回退到项目根目录后,直接进入controllers目录找到vendor下的自动加载文件,匹配实际路径。
内容的提问来源于stack exchange,提问作者Labanino

