根本原因是 autoload.php 未被正确引入或未重新生成自动加载规则;需确保入口文件首行引入 autoload.php、路径正确,修改 composer.json 的 autoload 后必须执行 composer dump-autoload,上线应重装 vendor 而非直接复制。

Composer 自动加载没生效,require 包后提示 Class not found
根本原因不是包没装,而是 autoload.php 没被引入,或引入位置不对。PHP 不会自动扫描 vendor/ 目录,必须显式加载 Composer 生成的自动加载器。
实操建议:
立即学习“PHP免费学习笔记(深入)”;
- 确认入口文件(如
index.php)顶部第一行就写了require __DIR__ . '/vendor/autoload.php';,且路径拼写正确(注意__DIR__和斜杠方向) - 如果项目用了子目录(比如
public/index.php),路径要回退:改成require __DIR__ . '/../vendor/autoload.php'; - 别在
if或函数里延迟加载autoload.php——类名解析发生在编译/运行初期,晚了就来不及 - 执行过
composer install或composer update吗?没执行的话vendor/autoload.php根本不存在
composer.json 里改了 autoload 配置但不生效
改完 composer.json 的 autoload(比如加了 psr-4 映射)后,必须重新生成自动加载规则,否则 PHP 还是按旧配置找类。
实操建议:
立即学习“PHP免费学习笔记(深入)”;
- 改完立刻跑
composer dump-autoload(简写composer du),而不是只刷新页面 - 如果用了开发时的 classmap 优化(
"optimize-autoloader": true),记得加-o参数:composer dump-autoload -o -
autoload-dev里的映射只在composer install --dev或本地开发时生效,线上部署若用了--no-dev,这部分自动加载会被跳过
本地能跑,上线就报 Class not found —— 路径大小写或文件权限问题
Linux 服务器严格区分大小写,而 macOS/Windows 开发环境常忽略这点;另外,vendor/ 目录若没读取权限,autoload.php 可能静默失败。
实操建议:
立即学习“PHP免费学习笔记(深入)”;
- 检查类名、命名空间、文件名三者是否完全一致(比如
MyService.php里定义class MyService,不能写成myservice或Myserver) - 用
ls -l vendor/autoload.php确认文件存在且可读(权限至少-rw-r--r--) - 上线时别手动复制
vendor/,用composer install --no-dev --optimize-autoloader在服务器上重装,确保自动加载逻辑与环境匹配
composer install 报错说找不到某个包,但 composer require 又能装上
这通常是因为 composer.lock 锁定了旧版本依赖,而新添加的包依赖更高版本的子包,导致冲突;或者镜像源不同步,install 从 lock 文件拉取时失败。
实操建议:
立即学习“PHP免费学习笔记(深入)”;
- 先删掉
composer.lock和vendor/,再跑composer install(仅限开发环境,生产环境慎用) - 更稳妥的做法是:用
composer update xxx/package-name单独更新冲突包,避免全量升级 - 检查当前源:
composer config repo.packagist.org.url,国内服务器建议切到阿里云镜像:composer config -g repo.packagist.org.url https://mirrors.aliyun.com/composer/
autoload 配置却忘了 dump-autoload,以及上线时直接传 vendor/ 而不是在目标环境重装——这两处一错,后面所有调试都是白忙。











