composer需配置autoload而非手动require;psr-4最常用,将命名空间映射到目录;classmap适用于不规范类;files用于全局函数;autoload-dev隔离测试类;修改后须运行composer dump-autoload。

Composer 不会自动加载你写的类,除非你明确告诉它“这些文件对应哪些命名空间”或“这些目录下的类该怎么找”。手动写 require 或 include 是反模式,正确做法是配置 autoload。
composer.json 里怎么配 autoload(PSR-4 最常用)
绝大多数现代 PHP 项目用 PSR-4 —— 它把命名空间映射到目录,Composer 自动生成映射表并写入 vendor/autoload.php。
示例:你的类在 src/Http/Client.php,类名为 MyAppHttpClient,那就这样写:
{
"autoload": {
"psr-4": {
"MyApp\": "src/"
}
}
}
注意:\ 是 JSON 里转义反斜杠的写法,实际表示命名空间分隔符;"src/" 是相对于 composer.json 的路径。
- 改完必须运行
composer dump-autoload(开发中可加-o生成优化版,但调试时建议不用) - 如果类文件名和类名不严格匹配(比如
Client.php里定义了class HttpClient),PSR-4 就找不到——这是最常踩的坑 - 多个命名空间可共存,比如同时加
"Utils\": "lib/utils/"
类不在标准命名空间下?用 classmap 更直接
适合老项目、工具函数文件、或命名不规范的类(比如 functions.php、DatabaseHelper.php 里塞了多个类)。
工作流任务拆解与模型编排技能。使用场景:(1) 收到复杂工作任务需要拆解为可执行步骤,(2) 需要为不同步骤选择最合适的模型,(3) 需要跟踪工作流进度和模型使用情况,(4) 长时间任务卡住需要问题诊断和解决方案。
classmap 不依赖文件名或命名空间,而是扫描指定目录/文件,把所有找到的类名记下来。
{
"autoload": {
"classmap": ["legacy/", "helpers/functions.php"]
}
}
- 运行
composer dump-autoload后,Composer 会递归扫描legacy/下所有.php文件,提取class、interface、trait声明 - 扫描结果写死在
vendor/composer/autoload_classmap.php,所以新增类后必须重新 dump - 别对大目录用 classmap(比如整个
vendor),会拖慢 autoload 生成速度
想临时加一个文件(比如 bootstrap.php)?用 files
files 是唯一一种“每次加载 autoload 时都无条件 include”的方式,适合放全局函数、常量定义、或初始化逻辑。
{
"autoload": {
"files": ["src/helpers.php"]
}
}
- 这个文件会在
require 'vendor/autoload.php'时立即执行,且只执行一次(Composer 内部用require_once) - 不能用来定义类——因为没走自动加载机制,其他地方 new 这个类会报错
- 如果文件里有语法错误,
vendor/autoload.php就会 fatal error,调试时容易懵
autoload-dev 和测试类怎么隔离
测试用的类(如 tests/TestCase.php)不该被生产环境加载,否则可能暴露敏感逻辑或增加内存开销。
用 autoload-dev 单独声明,它只在 composer install --dev 或默认安装时生效:
{
"autoload": {
"psr-4": { "MyApp\": "src/" }
},
"autoload-dev": {
"psr-4": { "MyApp\Tests\": "tests/" }
}
}
- 运行
composer install --no-dev时,autoload-dev完全不生效,tests/目录也不会出现在 autoload 映射里 - 如果你在测试代码里用了
MyApp命名空间下的类,它们仍能正常加载(因为主autoload还在) - 别把
autoload-dev当成“开发专用类加载”,它只是控制是否生成映射——文件本身是否可访问,取决于部署时有没有拷过去
真正麻烦的不是写配置,而是当类突然找不到时,得立刻判断是路径写错了、命名空间拼错了、没 dump、还是用了 --no-dev。多看一眼 vendor/composer/autoload_psr4.php 里的实际映射,比反复猜快得多。










