PSR-4映射需手动写在composer.json的autoload字段中,路径相对于项目根目录且结尾带/,命名空间结尾带\;修改后必须执行composer dump-autoload才生效。

psr-4 映射写在 composer.json 的 autoload 字段里
PSR-4 自动加载不是靠命令生成,而是手动在项目根目录的 composer.json 中声明命名空间与路径的对应关系。Composer 读取这个配置后,通过生成的 vendor/autoload.php 实现类文件的按需定位。
关键点:路径必须是相对于项目根目录的,且结尾要带 /(表示目录),命名空间结尾要带 \(表示命名空间作用域)。
-
"App\\": "src/"→App\Foo\Bar类会去找src/Foo/Bar.php -
"Tests\\": "tests/"→Tests\Unit\ExampleTest对应tests/Unit/ExampleTest.php - 多个映射可共存,顺序无关,但冲突时以先匹配到的为准
执行 composer dump-autoload 才能生效
改完 composer.json 后,不运行命令,require 'vendor/autoload.php' 不会识别新增的映射。Composer 不会在每次 require 时动态解析 JSON,而是把映射编译进 vendor/composer/autoload_psr4.php。
- 开发中频繁修改映射时,用
composer dump-autoload -o(优化模式)能生成静态映射表,提升加载速度 - 如果用了符号链接或 IDE 自动重命名类名,记得检查文件实际路径是否与 PSR-4 规则一致——比如
src/Helper/Json.php里的类必须叫App\Helper\Json,不能是App\Helper\JSON(大小写敏感) - 运行后若仍报
Class not found,用composer show --platform确认当前加载的 autoloader 是否已更新
不要把 vendor/ 或 tests/ 目录误设为根命名空间
常见错误是写成 "\\": "src/" 或 "": "src/",这会让 Composer 尝试把所有非限定类名(如 new Foo())都去 src/ 下找,结果破坏全局类(如 Exception、PDO)的解析,导致致命错误。
- 空字符串
""或反斜杠"\\"是非法的 PSR-4 命名空间前缀,Composer 7+ 会直接拒绝安装 - 测试类建议单独配置,例如
"Tests\\": "tests/",而不是混进主命名空间 - 第三方包的 autoload 已由其自身
composer.json定义,无需、也不该在你的项目里重复映射
注意 Windows 路径分隔符和大小写一致性
PSR-4 规范本身不区分大小写,但实际文件系统(尤其是 Linux/macOS)区分。Composer 生成的自动加载器会原样拼接路径,所以 src/Http/Client.php 只能被 App\Http\Client 加载,App\Http\client 或 App\HTTP\Client 都会失败。
- Windows 下开发时,即使文件系统不敏感,也建议严格保持命名空间与目录名大小写一致,避免部署到 Linux 服务器时报错
- 类文件名必须和类名完全一致(包括大小写),例如
class ApiResponse必须放在ApiResponse.php,不能是apiresponse.php - 如果用 IDE 重命名类,务必同步更新文件名和命名空间引用,否则
dump-autoload不会报错,但运行时找不到类










