ThinkPHP 报“Class not found”主因是自动加载失败:90%非类缺失,而是命名空间、路径、Composer配置未严格匹配;须确认入口引入autoload.php、PSR-4映射正确、手动类需显式注册或补composer配置,并检查大小写与文件名一致性。

ThinkPHP 报“Class not found”,90% 不是类没写,而是自动加载没走通。核心就一点:框架不会主动扫描文件,它只按规则找——命名空间、目录路径、composer 配置三者必须严丝合缝。
确认是否走 Composer 自动加载
ThinkPHP 6+ 完全依赖 Composer 的 autoload 机制。入口文件(如 public/index.php)第一行必须是:
require __DIR__ . '/../vendor/autoload.php';
漏掉这句,整个自动加载就瘫痪了。第三方 SDK 若已通过 composer require xxx/xxx 安装,且 composer.json 中有对应 PSR-4 配置,那只需确保这行存在,再运行:
立即学习“PHP免费学习笔记(深入)”;
-
composer dump-autoload -o(强制刷新映射) - 检查 vendor/composer/autoload_psr4.php 是否新增了你的命名空间条目
SDK 是手动放进去的(比如丢在 extend/ 或 Library/Vendor)
这种情况下 Composer 根本不认识它。不能指望 dump-autoload 扫到,必须显式注册:
- 方式一:用 ThinkPHP 的
Loader::addNamespace(),在应用初始化早期(如 common.php 或全局中间件中)调用:Loader::addNamespace('WeChat', app()->getAppPath() . 'extend/wechat/'); - 方式二:在
composer.json中补上 PSR-4 映射,例如:"autoload": { "psr-4": { "WeChat\": "extend/wechat/" } },再执行composer dump-autoload -o - 方式三:直接
require_once(仅限简单脚本或临时调试):require_once app()->getAppPath() . 'extend/wechat/WxPayApi.php';
检查命名空间与文件路径是否严格匹配
PSR-4 不是“大概对得上就行”,而是精确映射:
- 如果声明
namespace WeChatPay;,文件就必须放在extend/wechat/pay/WxPayApi.php - Linux 服务器区分大小写,
Wxpayapi.php≠WxPayApi.php - 类名和文件名要一致,
class WxPayApi必须对应WxPayApi.php,不能叫WxPayApi.class.php(那是 TP3.2 的老规矩,TP6+ 不适用)
接口注入或 App::make() 找不到实现类
这不是引入类库的问题,而是容器绑定缺失:
- 必须在对应子应用的
provider.php(如app/api/provider.php)里写绑定:App::bind(ppcontractPayInterface::class, ppserviceWxPayService::class); - 注意:要用全限定名(开头带
),不能用字符串别名 - 确认实现类真正
implements PayInterface,方法签名(参数类型、返回类型)也需完全一致 - 绑定后运行
php think optimize:autoload刷新容器缓存



















