根本原因是入口文件未引入 composer 自动加载器或 vendor 目录不完整;必须确保 public/index.php 包含 require dir . '/../vendor/autoload.php',且执行过 composer install/update,并检查 composer.json 的 psr-4 配置与路径大小写一致性。

ThinkPHP 6+ 中基类(如 thinkModel、thinkController)不是靠“手动加载”或自定义规则找的,而是由 Composer 的 PSR-4 自动加载机制原生支持——只要 vendor/autoload.php 被正确引入,且框架包未被破坏,这些基类就能直接 new 或继承。
为什么 extends thinkController 报 Class not found
根本原因不是 ThinkPHP “没加载基类”,而是入口文件漏引了 Composer 自动加载器,或 vendor 目录不完整。
-
public/index.php必须包含require __DIR__ . '/../vendor/autoload.php';——TP6 默认有,但如果你删过、改过或用了自定义入口,这行就可能丢失 - 运行过
composer install或composer update吗?没执行的话vendor/下没有thinkphp/framework,自然找不到thinkController - 检查
vendor/composer/autoload_psr4.php是否存在'think\' => array($vendorDir . '/top/thinkphp/src')这类映射(路径可能因版本微调,但必须有think\前缀) - 别在 IDE 里点跳转失败就断定“没加载”——有些 IDE 解析命名空间依赖缓存,重启索引或清缓存再试
自定义基类(如 AppBaseController)怎么让 TP6 自动加载
你写的基类不属于框架自带,TP6 不会自动识别,必须走 Composer PSR-4 显式注册;否则 class Index extends AppBaseController 会报错。
- 编辑项目根目录的
composer.json,在"autoload": {"psr-4": {}}里加一行:"App\Base\": "app/base/"(注意双反斜杠和末尾斜杠) - 确保物理路径是
app/base/Controller.php,且该文件顶部声明namespace AppBase; - 执行
composer dump-autoload(开发阶段别加-o,否则 classmap 会绕过 PSR-4 规则,导致改了命名空间也不生效) - 别把基类放
app/common/或extend/下还指望自动加载——那些目录默认不在 autoload 配置里
继承链中基类加载失败的隐蔽坑
看似继承了 thinkController,但实际触发的是你自己的中间基类,而中间基类的命名空间或路径一错,整个链就断了。
- 文件名大小写必须和类名完全一致:Linux 下
controller.php≠Controller.php,前者不会被加载 - 中间基类若用了
use thinkController,但当前文件没声明namespace,那thinkController会被解析成hinkController(全局命名空间),而非预期的thinkController - 如果在中间基类里写了
__construct()却忘了调用parent::__construct(),某些依赖初始化的行为(如请求对象注入)会静默失效,看起来像“加载了但功能不对” - TP6 的
thinkModel依赖thinkdbConnection等底层类,如果这些类因 autoload 配置缺失或路径错误无法加载,报错可能只显示“Class not found”,但真正卡在深层依赖上
最常被忽略的一点:基类加载问题往往不是“没配 autoload”,而是 vendor/autoload.php 没被引入、composer.json 改了但没 dump、或者文件系统大小写敏感性在开发机(macOS/Windows)和生产机(Linux)之间暴露了路径不一致。先确认 var_dump(class_exists('think\Controller')); 返回 true,再往下查自定义部分。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











