删 vendor 后仍报 class not found,是因为自动加载映射未刷新、opcache 未清、框架缓存(如 laravel 的 bootstrap/cache/)未删除;必须执行 composer dump-autoload -o、手动清框架缓存、重置 opcache 三步。

为什么删了 vendor 还报 Class not found
删掉 vendor 目录只是清除了包文件,但 Composer 的自动加载映射(vendor/composer/autoload_*.php)可能仍被旧代码引用,或 PHP opcode 缓存(OPcache)里还存着已删除类的加载路径。更隐蔽的是,某些框架(如 Laravel)会在 bootstrap/cache/packages.php 或 config.php 中缓存服务提供者列表,这些文件不会随 vendor 删除而失效。
必须执行的三步清理动作
仅删 vendor 是无效操作,要真正切断旧 autoload 关系:
- 运行
composer dump-autoload -o:强制重建优化版自动加载映射,清除所有残留类名到路径的硬编码绑定 - 手动删除
bootstrap/cache/下全部文件(Laravel)或runtime/(ThinkPHP),否则php artisan package:discover仍会从缓存读取旧包信息 - 重置 PHP 缓存:
php -r "opcache_reset();"或重启 PHP-FPM,否则即使类文件已不存在,OPcache 仍会返回“已加载”状态
检查 autoload 配置是否残留旧路径
Composer 的 autoload 配置一旦写死在 composer.json 里,哪怕对应包已被删,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,检查"autoload": {"psr-4": {...}}和"autoload-dev": {...},删掉指向已移除包的命名空间(例如"OldPackage\": "old-src/") - 搜索
vendor/composer/autoload_static.php,确认里面没有旧类名(如'OldPackage\Helper' => __DIR__ . '/..' . '/old-src/Helper.php')——若有,说明上次dump-autoload是在包未卸载前执行的 - 如果项目用了
autoload.files,逐行验证每个文件是否存在,缺失即删
CI/CD 或 Docker 构建中特别容易漏掉的点
自动化环境里,composer install 后常因阶段错位导致 autoload 失效:
- 构建脚本在
post-install-cmd阶段就调用php artisan,但此时vendor/autoload.php尚未写入完成——应改用post-autoload-dump钩子 - Docker 构建时若用
COPY . /app复制整个目录,且composer install由非 root 用户执行,vendor/权限可能为755但属主错误,PHP-FPM 无法读取 autoload 文件——需加RUN chown -R www-data:www-data vendor - Git 仓库里误提交了
vendor/composer/autoload_classmap.php,它会覆盖动态生成的映射——确保该文件在.gitignore中
autoload 冲突的本质不是“类找不到”,而是“类不该被找到却还在被找”。关键在于切断所有残留映射路径,而不是反复删 vendor 或重跑 install。










