composer dump-autoload不是刷新缓存,而是重写自动加载映射文件;修改类路径、命名空间或composer.json中autoload配置后必须执行,否则新类无法加载,常见于新增类、移动类、更新psr-4映射、ci中缺失dev类等场景。

composer dump-autoload 不是“刷新缓存”,而是重写自动加载映射文件;改了类路径、命名空间或 composer.json 里的 autoload 配置后,必须执行它,否则新类永远找不到。
什么时候非跑 composer dump-autoload 不行
不是每次改完 PHP 文件都要跑——只有以下情况才真需要:
- 新增了一个类文件(比如
src/Services/Logger.php),但new Logger()报Class not found - 把类从
src/Models/User.php移到了src/Domain/User.php,但命名空间没同步改,或改了但没更新映射 - 在
composer.json的autoload.psr-4里加了新映射(如"App\Domain\": "src/Domain/") - CI 流水线里用了
composer install --no-dev,但本地开发时写了测试类在autoload-dev下,部署后发现类缺失 -
composer install或update没触发自动重建(比如用了--no-autoloader)
composer dump-autoload -o 到底优化了什么
-o(即 --optimize)会生成 vendor/composer/autoload_classmap.php,把所有 PSR-4/PSR-0 声明路径下的类文件路径硬编码进一张表里。运行时不再遍历目录、不靠文件名猜类名,直接查表——快,但代价明确:
- 只扫描
composer.json里autoload(不含autoload-dev)声明的路径,files类型的函数文件不会被收录 - 新增类文件后,必须再跑一次
dump-autoload -o,否则查不到 - 如果类文件存在但命名错误(比如
Foo.php里定义了class Bar),-o依然会把它写进classmap——运行时报错,但错误源头难定位 - 离线可用,只要
vendor/autoload.php存在且路径配置没变
为什么跑了 composer dump-autoload 还是 Class not found
命令执行成功 ≠ 自动加载就通了。真正卡住的地方往往在配置本身:
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
-
composer.json里"App\": "src/App"少了个末尾/→ 应该是"App\": "src/App/" - 命名空间是
AppControllers,但文件放在src/controllers/HomeController.php(小写controllers)→ Linux 下直接失败 - 用了
"files": ["src/helpers.php"],但这个文件里定义了class Helper→files只载函数,不注册类 - 执行后检查
vendor/composer/autoload_psr4.php,确认你的命名空间键是否真实存在(比如有没有多打空格、反斜杠转义不对)
生产环境别单独跑 dump-autoload -o
它大概率白干。Composer 2.x 默认已启用 classmap 生成逻辑,dump-autoload -o 不再触发完整 classmap 扫描,除非项目里明确定义了 "classmap" 字段或存在兼容性 fallback。真正生效的命令是:
composer install --no-dev --optimize-autoloader
这个命令会:校验 composer.lock、跳过 require-dev 包、强制重生成 autoload_classmap.php、并启用优化模式——三件事一步到位。加 --classmap-authoritative 后,它才真正“只信这张表”,彻底绕过目录遍历。但注意:这要求所有运行时用到的类都必须被扫描进 classmap,否则直接报 Class not found。
动态拼类名(如 $class = $prefix . 'Handler')不会进 classmap,得提前 require_once 或改用 class_alias();Laravel 的路由闭包、Symfony 的服务配置里匿名类,若未显式声明在 classmap 或 PSR-4 规则下,也会挂掉。










