Composer PSR-4自动加载找不到Shop\Guitar\Guitar类如何修复
问题根因
出现Class "Shop\Guitar\Guitar" not found报错核心原因是Composer自动加载映射未更新,同时代码里存在的不规范写法也可能引发其他加载异常:
- Composer的PSR-4自动加载不会在运行时动态扫描目录生成映射,所有命名空间和文件路径的对应关系会提前生成为静态缓存文件存放在
vendor目录下。你修改composer.json添加完自动加载规则后,没有执行命令刷新缓存,加载逻辑还是旧版本,自然找不到src目录下的类。 - 你在
src下的每一个类、接口、枚举文件里都重复写了require_once __DIR__ . '/../vendor/autoload.php';,这个逻辑完全多余:自动加载入口文件只需要在项目入口脚本(比如测试入口、Web请求入口文件)引入一次即可,在业务类里重复引入不仅冗余,后续调整目录结构时还容易引发路径引入错误。 - 额外的隐性问题:测试文件名是
GuitarTest.php,但文件内定义的测试类名为InventoryTest,类名和文件名不匹配,不符合PSR加载规范和PHPUnit的默认测试扫描规则,就算解决了类找不到的问题,后续也会出现PHPUnit识别不到测试用例的问题。
修复方案
按以下步骤操作即可解决问题:
- 清理冗余引入:删除
src/Guitar.php、src/Type.php、src/ToString.php三个文件里的require_once __DIR__ . '/../vendor/autoload.php';代码行,仅保留测试文件tests/GuitarTest.php里的自动加载引入语句即可。 - 统一测试文件名和类名:要么把
GuitarTest.php里的final class InventoryTest修改为final class GuitarTest,要么把文件名重命名为InventoryTest.php,保持类名和文件名一致。 - 打开终端进入
composer.json所在的项目根目录,执行命令刷新Composer自动加载缓存:
composer dump-autoload --dev
加--dev参数会同时生成开发依赖(包括PHPUnit)和业务类的加载映射,适合本地测试场景使用。
4. 重新运行测试命令即可正常加载Shop\Guitar\Guitar类。
配置校验参考
如果执行完上述步骤还是报错,可以对照检查composer.json的自动加载配置层级是否正确,正常结构参考如下:
{ "require": {}, "require-dev": { "phpunit/phpunit": "^9.0|^10.0" }, "autoload": { "psr-4": { "Shop\\Guitar\\": "src/" } }, "autoload-dev": { "psr-4": { "Shop\\Guitar\\Tests\\": "tests/" } } }
提示:后续只要修改了
composer.json里的autoload相关配置,都需要重新执行一次composer dump-autoload才能让新规则生效。
内容的提问来源于stack exchange,提问作者Farzin
相关产品推荐
相关产品推荐

