thinkphp 6 升级到 8.0 需满足 php 8.1+ 环境、更新核心依赖与容器逻辑、同步 cli/web sapi、启用必要扩展、适配 swoole/多应用扩展、重写 composer.json 并刷新依赖、清理缓存、迁移路由与配置、替换 request 调用、适配 orm 返回值及中间件和软删除行为。

将 ThinkPHP 6 升级到 8.0 不是改个版本号就能跑通的事,必须先确认 PHP 环境是否满足 8.1+ 强制要求,再同步更新核心依赖与容器反射逻辑,否则 runtime 里一堆 Class not found 或 ReflectionParameter::getClass() 已弃用的报错会直接卡死部署流程。
确认 PHP 环境与扩展就绪
执行 php -v 查 CLI 版本,同时在 Web 环境中运行 phpinfo() 或 php -r "print_r(get_loaded_extensions());",确保 CLI 和 Web SAPI 使用的是同一套 PHP 8.1+ 运行时——【不同步会导致 composer update 成功但浏览器访问直接 500】。
检查 mbstring、openssl、pdo_mysql、json、ctype、xml 扩展是否全部启用。若项目使用 Swoole 或多应用扩展,需确认 topthink/think-swoole 或 topthink/think-multi-app 是否已发布适配 TP8 的版本。
这一步操作起来很简单,直接把文件拖进去就行。
重写 composer.json 并强制刷新依赖链
打开项目根目录下的 composer.json,将 "topthink/framework": "^6.0" 替换为:
"topthink/framework": "^8.0",<br>"topthink/think-orm": "^3.0",<br>"topthink/think-filesystem": "^2.0",<br>"php": ">=8.1.0"
删除 composer.lock 文件——旧 lock 会锁死 TP6 依赖,不删必出错。
运行 composer update topthink/framework --with-all-dependencies。若提示依赖冲突,说明 monolog、psr/log 等子依赖版本太旧,必须一并升级,不能跳过。
清理缓存并迁移路由与配置结构
第一步:删除 runtime/ 全目录。残留缓存会导致路由注册失败、中间件未加载、甚至 config/route.php 被忽略。
第二步:将原 route/route.php 中的路由定义整体迁移到 app/Route.php 中,并改用闭包或控制器类方法绑定语法:Route::get('user/:id', [app\controller\Index::class, 'userRead'])。
第三步:检查 config/ 下所有配置文件,移除对 application/ 目录的硬编码路径引用;TP8 已彻底移除该目录结构,统一使用 app/ + config/ 双主干。
第四步:替换所有 Request::instance() 为 think\facade\Request 或构造函数注入 think\Request 实例。
适配 ORM 与中间件行为变更
方法一:模型查询返回 null 不再抛异常
若你写了 public function getUser(int $id): ?array,TP8 的 think-orm 3.0 会在查不到数据时安静返回 null。调试时别只看有没有报错,要加 var_dump($result); 确认实际返回值。
方法二:中间件不再自动继承父分组
TP8 默认按「全局 → 分组 → 路由级」叠加,且分组中间件不会自动下推到子路由。必须显式调用 ->middleware(AdminAuth::class) 追加。
方法三:软删除字段默认行为变更
TP6 中 delete_time 字段为 NULL 表示未删除;TP8 默认改用 0 表示未删除,若数据库存量数据仍用 NULL,需在模型中显式设置 protected $deleteTime = 'delete_time:timestamp'; 并补全迁移 SQL。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











