Class not found 错误本质是PSR-4自动加载失败,需严格确保路径、命名空间、composer.json配置、PHP环境四者完全一致,差一个大小写或斜杠即报错,新增类后必须执行composer dump-autoload -o刷新映射。

Class not found 错误不是类文件丢了,是 PSR-4 自动加载没对上路标——路径、命名空间、composer.json 配置、PHP 环境四者只要差一个字母大小写或斜杠,就必然报错。
看错误堆栈里报的是哪个类名
比如 Class 'WeChatPay' not found 或 Class 'aop\AopClient' not found,先确认这个类名是否真实存在于你的项目中:
- 用 IDE 全局搜索该类名,看它在哪个文件里(注意大小写)
- 打开对应文件,检查第一行
namespace声明是否和类名前缀完全一致(例如aop\AopClient要求文件里写namespace aop;) - 检查该文件所在目录是否和命名空间结构严格匹配(
namespace aop\request;→ 必须放在extend/aop/request/下) - Linux 服务器上,
AopClient.php和aopclient.php是两个文件,Windows 开发时可能不暴露问题
确认 SDK 是不是通过 composer require 安装的
直接把 SDK 文件夹拖进 extend/ 或 library/,Composer 根本不会扫描它,dump-autoload 也救不了:
- 运行
composer show查看是否列出对应包(如overtrue/wechat或yansongda/pay) - 如果没列出来,说明没走 Composer 流程,得重装:
composer require yansongda/pay:^4.0 - 如果只是临时测试,又不想改 composer.json,可用
"files"方式强制加载单个文件:"autoload": {"files": ["extend/alipay/aop/AopClient.php"]} - 改完
composer.json后必须跑composer dump-autoload -o,只清缓存或重启服务没用
检查 vendor/autoload.php 是否被正确引入
ThinkPHP 不会自动 include Composer 的自动加载器,入口文件里漏了这句就会全盘失效:
立即学习“PHP免费学习笔记(深入)”;
- TP6
public/index.php中,require __DIR__ . '/../vendor/autoload.php';必须出现在think\initializer\Error::init();之前 - TP5.x 同样要确认
public/index.php首行有require __DIR__.'/../vendor/autoload.php'; - CLI 脚本调试时,常忘记加这句,导致
php think test报错而 Web 正常 - 某些老项目手动删过
vendor/autoload.php引入逻辑,或用了自定义启动流程,需逐行核对
留意 PHP 版本与 SDK 的硬性兼容要求
很多报错表面是“找不到类”,实际是 SDK 内部已弃用某些特性,PHP 版本不匹配导致 autoload 规则失效:
-
aliyuncs/oss-sdk-phpv2.6+ 要求 PHP 8.0+,TP6 项目若还跑在 PHP 7.4,必须锁定composer require aliyuncs/oss-sdk-php:2.5.2 -
easywechat/easywechat:^6.0同样要求 PHP 8.0+,TP6 + PHP 7.4 项目得退到overtrue/wechat:~5.0 - 运行
php -v确认实际版本,别只看 Dockerfile 或宝塔面板显示 - 有些 SDK(如旧版支付宝 AOP)依赖
__autoload函数,PHP 7.2+ 已移除,必须补spl_autoload_register或换新版 SDK
真正卡住人的地方往往不在代码本身,而在命名空间声明和磁盘路径之间那个看不见的映射关系——它不报语法错,只在运行时静默失败。多花 30 秒用 ls -l 看一眼文件权限和大小写,比重装 SDK 有效得多。



















