autoload-dev 专用于开发期自动加载非生产代码,如 tests/、bin/ 等路径;不可与 autoload 重复定义相同命名空间,否则引发优先级混乱;生产环境完全忽略 autoload-dev。
autoload-dev
是给测试代码、命令行工具这类「只在开发时需要加载」的类用的,不是用来补全主 autoload 的漏洞。
autoload-dev 该放哪些路径
它只管「开发期需要自动加载但不该进生产包」的代码,比如
、
、
或
下的类。别往里塞
或业务逻辑——那该走
。
—— 最常用,测试类命名空间对齐目录
—— 适合无命名空间的脚本或老式类文件
别写
—— 这属于主 autoload 职责,dev 里重复会导致 autoload 优先级混乱
和 autoload 冲突时谁生效
Composer 加载器会把
和
合并成一个映射表,但
的规则不参与生产环境的 autoloader 生成(比如运行
时会被直接忽略)。
Composer 2.9.6
Composer 2.9.6 是 PHP 生态中高效、稳定的依赖管理工具。此版本在性能与兼容性上进一步优化,改进了依赖解析算法,提升大型项目中的安装与更新速度。它支持并行下载任务,显著减少等待时间,并增强了与私有仓库及镜像源的交互稳定性。同时修复了多项命令行交互与内存使用相关的缺陷,确保在复杂依赖关系下依然可靠运行。无论是新项目初始化还是现有系统维护,Composer 2.9.6 都能为开发者提供流畅、精准的依赖管理体验。
下载
开发环境下:两条规则都生效,但若同一命名空间被两边同时定义(比如
出现在两个字段),
优先,
的同名规则会被覆盖
生产环境下:
完全不加载,哪怕你手动 require 它的文件,只要没显式
,就不会触发自动加载
常见错误:本地跑测试没问题,部署后报
—— 很可能把本该进
的类误塞进了
PSR-4 和 classmap 混用要注意什么
可以混,但得清楚各自边界:
靠命名空间推导路径,
靠扫描物理文件。一旦某个类同时匹配两者,
会优先生效(因为它是静态映射,无需解析命名空间)。
示例:
+
→ 即使
里声明了
,也会按 classmap 路径加载,不走 PSR-4 推导
性能影响:classmap 在 dump-autoload 时生成,体积大了会拖慢 autoload 初始化;PSR-4 更轻量,但首次访问类时有路径拼接开销
容易踩的坑:用 classmap 扫描了整个
目录,结果把 PHPUnit 自带的 Mock 类也扫进去了,导致命名冲突或版本错乱
真正麻烦的是跨包协作场景:比如 A 包声明了
,B 包 require A 并想复用它的测试工具类——这时 B 包必须自己在
里重新映射,Composer 不会继承依赖包的 dev autoload 规则。
tests/bin/stub/examples/src/autoload"psr-4": { "Tests\": "tests/" }"classmap": ["bin/", "examples/"]"psr-4": { "App\": "src/" }autoload-devautoloadautoload-devcomposer install --no-dev"App\": "src/"autoloadautoload-devautoload-devrequireClass not foundautoloadautoload-devpsr-4classmapclassmap"psr-4": { "Tests\": "tests/" }"classmap": ["tests/Helper.php"]Helper.phpnamespace Tests;tests/autoload-devautoload-dev