必须引入vendor/autoload.php并正确配置composer.json,否则Class not found;PSR-4要求命名空间结尾带反斜杠、路径结尾带斜杠、大小写严格一致;修改后须运行composer dump-autoload。

Composer 自动加载不是“写个函数就能用”,而是靠 vendor/autoload.php 里注册的 spl_autoload_register() 加载器,配合你在 composer.json 中声明的映射规则来工作的。改了配置不运行命令、路径或命名空间差一个字符、入口没引入 autoload 文件——这三类问题占了 90% 的 “Class not found” 报错。
为什么 require 'vendor/autoload.php' 必须放在最前面
这是整个自动加载链启动的唯一开关。它内部调用 spl_autoload_register() 注册多个 loader,一旦错过这个时机,后续任何类实例化(比如 new AppService())都会因无可用加载器而直接失败。
- 不能包在
if、function或try/catch里——PHP 在解析时就可能触发类加载 - CLI 脚本和 Web 入口(如
index.php)都得各自显式引入,作用域不共享 - 别用
include替代require_once:失败时不报错,问题更隐蔽 - 如果用了框架(如 Laravel),确认它没在 bootstrap 前就提前 new 了某个类——那 autoload 还没注册就炸了
psr-4 配置写错一个符号就失效
psr-4 是现代项目首选,但它对格式极其敏感:命名空间结尾必须带反斜杠、路径结尾必须带斜杠、大小写必须完全一致。Linux 下文件系统区分大小写,UserController.php 里定义 class usercontroller 就永远找不到。
工作流任务拆解与模型编排技能。使用场景:(1) 收到复杂工作任务需要拆解为可执行步骤,(2) 需要为不同步骤选择最合适的模型,(3) 需要跟踪工作流进度和模型使用情况,(4) 长时间任务卡住需要问题诊断和解决方案。
-
"App": "src/"是合法的;"App": "src/"(缺)或"App": "src"(缺/)都会静默失效 - 类
AppControllerHome对应路径是src/Controller/Home.php,不是src/App/Controller/Home.php - 路径是相对于
composer.json所在目录的,不是项目根目录也不是vendor/ - 改完
composer.json后,必须手动执行composer dump-autoload,否则vendor/autoload.php不会更新
classmap 和 files 各自适合什么场景
别硬套 psr-4 到老代码上。classmap 适合无命名空间、类名不规范或目录结构混乱的遗留项目;files 只该放纯函数/常量文件,且每次请求都会无条件加载。
-
classmap示例:"classmap": ["legacy/", "utils/Helper.php"],运行composer dump-autoload后会扫描并生成静态映射表 -
files示例:"files": ["src/helpers.php", "config/constants.php"],这些文件在 autoload 初始化时就被require_once,不参与类查找流程 -
files中的路径必须是相对于composer.json的完整路径,写成"helpers.php"会报错 - 多个
files按数组顺序执行,前面的函数可被后面的覆盖——没做function_exists()防护就容易出问题
autoload-dev 配置常被忽略的细节
测试类(如 PHPUnit)通常放在 tests/ 下,但它的自动加载只在开发环境下生效。CI 流水线若加了 --no-dev,autoload-dev 里的映射就完全不可见。
-
autoload-dev写法和autoload一致,例如:"Tests\": "tests/" - 上线打包时,
autoload-dev不会进最终包,所以测试类不会混入生产环境 - 别把测试类塞进主
autoload区——会导致生产环境多加载一堆无用文件 - PHPUnit 发现测试类依赖这个映射,配错就会报
Class 'TestsTestCase' not found
最常被跳过的动作是:改完 composer.json 后没在项目根目录下运行 composer dump-autoload,或者误以为 vendor/autoload.php 是可编辑文件——它每次都会被重写,手改等于白干。

















