Class not found主因是自动加载失效:入口文件未引入vendor/autoload.php、未执行composer dump-autoload -o更新映射,或PSR-4路径与命名空间不严格匹配。

Class not found 报错不是容器本身坏了,而是容器要加载的类根本没进自动加载表——90% 情况下,thinkContainer 找不到,是因为 vendor/autoload.php 没被正确引入,或 Composer 没生成有效映射。
入口文件是否漏引 vendor/autoload.php
TP6 启动完全依赖 Composer 自动加载,框架核心类(包括 thinkContainer)全靠 vendor/autoload.php 注册。一旦入口文件(如 public/index.php)第一行没这句,后续所有类都不可用。
- 检查
public/index.php开头是否为:require __DIR__ . '/../vendor/autoload.php'; - 别写成
require '../vendor/autoload.php';(相对路径在 CLI 下可能失效) - 别在中间件、命令类、测试文件里重复
require—— 会触发Fatal error: Cannot redeclare class - 如果用 Swoole 或 Workerman,确保子进程启动前已加载该文件,而不是每次请求都重 require
composer dump-autoload -o 是否执行过
TP6 不再自带类加载器,所有 PSR-4 映射必须由 Composer 生成。新增控制器、服务类、或改过 composer.json 的 autoload 段后,不手动刷新,类就“存在但不可见”。
- 改完
composer.json的psr-4配置(比如加了"app\service\": "app/service/"),必须运行:composer dump-autoload -o - 不加
-o会生成未优化版,开发中偶尔能跑,但 CI/CD 或生产环境大概率失败 - 检查
vendor/composer/autoload_psr4.php,确认你要的命名空间是否出现在数组键里(例如'think\' => array($vendorDir . '/topthink/think-ide-helper/src')) - 如果用 Git 管理,注意
vendor/不提交,CI 流水线必须跑composer install --no-dev+dump-autoload -o
类文件路径与命名空间是否严格匹配 PSR-4
TP6 完全遵循 PSR-4,大小写、斜杠方向、命名空间声明、文件名三者必须一致,缺一不可。Windows 下不报错,Linux 上直接 Class not found。
-
app/controller/IndexController.php必须以namespace appcontroller;开头,类名为class IndexController(首字母大写,不能是indexcontroller) - 路径中不能混用大小写:比如
App/Service/UserService.php对应namespace AppService;,但 TP6 默认注册的是"app\": "app/",所以实际应为app/Service/UserService.php+namespace appService; - 确认文件保存编码是 UTF-8 无 BOM,BOM 会导致
namespace前有不可见字符,解析失败 - 别在
extend/目录随便放类然后 new —— 它默认不在 autoload 范围内,除非你显式加进composer.json并dump-autoload
为什么 composer install 成功了却还是报错
成功只是指依赖包下载解压完成,不代表自动加载机制就绪。常见静默失败点比想象中多。
- 目标目录非空时,
composer create-project会跳过初始化,vendor/autoload.php根本没生成 —— 运行前先清空文件夹 - PHP 版本低于 7.2.5(TP6 最低要求),
composer install可能中途失败但不报红,vendor/缺关键包(如topthink/framework),导致thinkContainer不存在 - 执行
php -r "require 'vendor/autoload.php'; echo 'OK';"在项目根目录下验证,输出 OK 才算真正可用 - Web 服务器 document root 指向错误(比如设成了项目根目录而非
public/),导致入口文件加载时../vendor/autoload.php路径解析失败
最易忽略的一点:TP6 的容器加载链条非常短,没有兜底逻辑。它不会尝试扫描目录、不会 fallback 到 __autoload、也不会自动补全命名空间。你看到的每个 Class not found,背后都是明确的路径/命名空间/加载时机三者之一断开了。查的时候,盯死 vendor/autoload.php 是否加载、autoload_psr4.php 是否含目标项、类文件是否真按 PSR-4 规则存放——绕开这三个点排查,基本都在原地打转。

















