composer 本身无热更新机制,所有自动加载依赖静态映射;修改代码后必须显式执行 composer dump-autoload(开发)或 dump-autoload -o(生产),并清除 opcache 或重启 php 进程才能生效。

Composer 本身没有“热更新”或“卸载类”的运行时机制——所有自动加载行为都基于静态映射,修改代码后必须显式重建 autoload 文件才能生效。
composer dump-autoload 不刷新已加载的类
PHP 的 spl_autoload_register() 注册的是函数指针,一旦类被加载进内存(例如通过 new AppControllerUserController),就不会再次触发自动加载器。即使你改了 src/Controller/UserController.php 内容,也不会自动重载。
- 这是 PHP 语言层限制,不是 Composer 缺陷
-
dump-autoload只更新映射表(autoload_psr4.php、autoload_classmap.php),不清理已加载类 - 开发中依赖 Xdebug 或 PHP-FPM 的 opcache reset 才能“看到”新代码,但类定义仍需重启进程
如何让新类/改名类立即生效
常见场景:新增 AppServiceEmailSender 类,或把 AppModelUser 改名为 AppModelUserProfile,但 new EmailSender() 报错或旧类仍能实例化。
工作流任务拆解与模型编排技能。使用场景:(1) 收到复杂工作任务需要拆解为可执行步骤,(2) 需要为不同步骤选择最合适的模型,(3) 需要跟踪工作流进度和模型使用情况,(4) 长时间任务卡住需要问题诊断和解决方案。
- 先确认命名空间和文件路径严格匹配 PSR-4 规则:
App→src/,且文件名是EmailSender.php,类名是class EmailSender - 运行
composer dump-autoload(开发环境)或composer dump-autoload -o(生产环境)重建映射 - 如果用了 opcache,需执行
opcache_reset()或重启 PHP 进程(如sudo systemctl restart php8.3-fpm) - 检查
vendor/composer/autoload_psr4.php是否已写入新条目,例如'App\Service\' => array($baseDir . '/src/Service')
删除类后仍能 new 成功?
现象:rm src/Model/User.php,但 new User() 不报错,甚至还能调用方法——说明类定义还在 PHP 内存里,或 opcache 缓存了旧字节码。
- 这不是 Composer “没卸载”,而是 PHP 运行时不会主动 unload 类
- 即使
autoload_psr4.php里还留着旧映射,只要文件不存在,下次 new 会抛出Class 'AppModelUser' not found - 真正“卸载”只发生在进程重启后;临时解决可加
if (class_exists('User')) { spl_autoload_unregister(...); },但不推荐 - CI/CD 中建议在部署脚本末尾加
composer dump-autoload -o && sudo systemctl reload php*-fpm
最易忽略的一点:PSR-4 映射是“前缀匹配”,不是精确路径绑定。删了文件但没删映射,或者目录结构与命名空间不一致,都会导致看似“卸载失败”的假象。










