composer.json 中没有 autoload.exclude-from-classmap 配置项;classmap 仅扫描明确列出的路径,排除目录应通过不将其加入 classmap 或使用 autoload-dev 实现。
composer
.
js
on 中的
不起作用?
这个配置项根本不存在——
的标准 autoload 字段里没有
。很多人搜到过类似写法,其实是把旧版文档、第三方插件或自定义脚本的逻辑混淆了。ClassMap 自动加载机制本身不支持“排除目录”,它只认你明确告诉它要扫描哪些路径。
里只写需要的目录,别把测试/工具代码混进去
ClassMap 加载靠的是
扫描指定路径下所有 PHP 文件并生成映射表。它不会自动跳过
或
,除非你压根没把它们加进配置。
错误写法(把整个
和
都塞进去):
正确做法(只列生产代码路径):
如果确实有少量非标准结构的类文件在
下但不想被加载,就不要放那里——挪到
或
这类不参与 autoload 的目录
想彻底屏蔽某目录?用
+ 目录隔离
Composer 区分生产和开发依赖的自动加载规则。把测试、命令行工具、示例等代码统一放进
,再确保
时这些规则不生效,是最干净的“排除”方式。
PHP 8.5.5
PHP 8.5.5 是 PHP 8.5 分支的维护更新版本。该版本延续了“小步快跑”的迭代逻辑,通过深度错误修复、底层性能微调以及安全加固,旨在为开发者提供一个更健壮、更高效的运行环境。该版本严格遵守语义化版本规范,不包含破坏性变更。
下载
只在开发环境生效,线上部署时不会生成对应映射
避免在
里写
、
、
示例配置:
PSR-4 加载下,“排除”本质是路径不匹配
PSR-4 是前缀映射,不是文件扫描。只要命名空间和目录结构对不上,类就根本不会被尝试加载——这本身就是最轻量级的“排除”。比如:
你声明
,那么只有
对应
如果没声明
前缀,它永远不会被 PSR-4 加载
想让某个子目录完全失效?别给它配 namespace 映射,也别把它塞进
注意:PHP 会 fallback 到
或手动
,所以真正“排除”还得靠项目结构约束,而非 autoload 配置本身
实际项目中,autoload 排除问题往往暴露的是目录职责混乱。与其纠结怎么“排除”,不如先确认:那个目录里的代码,真的该由 Composer 自动加载吗?
autoload.exclude-from-classmapcomposer.jsonexclude-from-classmap"classmap"composer dump-autoload -otests/bin/src/tests/{
"autoload": {
"classmap": ["src/", "tests/"]
}
}{
"autoload": {
"classmap": ["src/"]
}
}src/resources/stubs/autoload-devautoload-devcomposer install --no-devautoload-devautoloadtests/examples/bin/{
"autoload": {
"psr-4": {
"App\": "src/"
}
},
"autoload-dev": {
"psr-4": {
"App\Tests\": "tests/",
"App\Example\": "examples/"
}
}
}"App\": "src/"AppFooBarsrc/Foo/Bar.phpsrc/Tools/Helper.phpTools\classmapinclude_pathrequire