
PSR-4 映射必须手动写在 composer.json 里
Composer 不会自动扫描你的 src/ 目录生成 PSR-4 规则,它只认你明文写进 composer.json 的映射。没配,就等于不存在;配错一个反斜杠或路径,Class not found 立刻报给你看。
-
"App\": "src/"是合法写法 —— 命名空间键必须以双反斜杠结尾(PHP 字符串中表示一个字面量),否则会被当转义处理,降级为 PSR-0 或直接忽略 - 路径值是相对于
composer.json所在目录的相对路径,不能以/开头(如"/src/"❌),也不能是绝对路径 - 路径末尾建议带
/(如"src/"✅),虽然部分版本容忍"src",但不加易在 CI 或新版 Composer 中触发警告 - 多个映射可并存:
"Tests\": "tests/"、"Vendor\Package\": "lib/vendor-package/",但前缀不能重叠(比如同时写"App\"和"App\Http\",后者永远不会被匹配到)
composer dump-autoload 不是可选操作,而是生效前提
改完 composer.json 后不运行这条命令,require 'vendor/autoload.php' 完全感知不到新映射 —— 因为 Composer 把所有 PSR-4 规则编译进了 vendor/composer/autoload_psr4.php 这个 PHP 数组文件,不是每次 require 都去读 JSON。
- 本地开发:改完配置后必跑
composer dump-autoload - 生产部署:应使用
composer install --no-dev --optimize-autoloader,它会跳过动态查找逻辑,只走预生成的映射表,性能更高 - 若启用
"classmap-authoritative": true,未被映射的类会直接 fatal error,适合线上环境,但要求所有类都得在 PSR-4 或 classmap 覆盖范围内
类文件路径必须和命名空间“硬对齐”,差一个字母都不行
PSR-4 不是模糊匹配,而是确定性拼接:拿到 AppControllerUserController,就严格截掉前缀 App,把剩下 ControllerUserController 中的 替换成 /,再拼上目录,得到 src/Controller/UserController.php。中间任何环节断开,加载即失败。
- 目录结构必须与命名空间层级完全一致:
AppModelsPost→src/Models/Post.php,不是src/models/post.php(大小写敏感) - 文件名必须和类名完全一致:
class UserRepository必须在UserRepository.php,不能是user_repository.php或userRepository.php - 确保目标目录真实存在 ——
"src/"映射的前提是项目根目录下真有这个文件夹,空目录或拼写错误(如"srce/")都会导致类找不到
测试代码要用 autoload-dev 单独配置
把测试类(比如 TestsUnitUserTest)混进主 autoload 里,不仅增加生产环境内存开销,还可能意外暴露测试路径或辅助函数。Composer 提供了专门的 autoload-dev 区块,只在开发时生效。
- 写法和主 autoload 一样:
"autoload-dev": { "psr-4": { "Tests\": "tests/" } } - 执行
composer install --no-dev时,这些映射不会写入autoload_psr4.php,也不会被vendor/autoload.php加载 - CI/CD 流程中务必加
--no-dev,否则测试类可能污染生产自动加载器
Class not found。










