tp8.0是开发范式切换而非单纯版本升级,需清环境、重构目录结构、改事件机制、严守模型三约束,并以官方脚手架为标尺比对迁移。

直接上手 TP8.0 不是“换版本”,而是切换开发范式。老鸟的优势在于熟悉 TP5.1 的运行逻辑,劣势在于容易沿用旧习惯踩坑——比如还想着改 tags.php、还在模型里写 protected $table = 'xxx' 在前、$name 在后,或者用 === false 判断查询结果。
先清地基:确认环境不是“假升级”
很多问题根本不是框架问题,是环境没对齐:
- 执行
php think version,必须看到v8.x.x;若还是v5.1.xx,说明你连第一步都没走,别急着改代码 -
php -v和 Web 环境(如phpinfo())的 PHP 版本必须都 ≥ 8.0.0,且扩展一致:重点检查mbstring、pdo_mysql、openssl、json、curl - 删掉整个
runtime/目录——缓存不清理,90% 的路由 404、配置加载失败都源于此
核心结构必须重认:目录、命名空间、加载逻辑
TP8.0 不再兼容 TP5.1 的项目结构惯性:
- 没有
application/目录,只有app/;config/是顶层目录,不是application/config/ -
composer.json中必须明确声明:"topthink/framework": "^8.0"、"topthink/think-orm": "^3.0"、"topthink/think-filesystem": "^2.0" - 自动加载规则变了:TP5.1 常用
app\或App\,TP8 默认是app\(小写 a),若你项目用了大写App\,要同步改composer.json的psr-4映射,并执行composer dump-autoload -o
行为 → 事件:最易忽略的架构断层
TP5.1 的 tags.php + 行为类(run() 方法)在 TP8 中已彻底移除,换成 PSR-14 标准事件系统:
- 删掉
tags.php和所有继承自Behavior的类 - 新建事件类(如
app/event/UserLoginEvent.php),只负责封装数据 - 新建监听器类(如
app/listener/SendLoginNoticeListener.php),实现__invoke()或定义handle() - 在
app/event.php中绑定:['app\event\UserLoginEvent' => ['app\listener\SendLoginNoticeListener']]
模型与 ORM:三处硬约束,错一个就静默失效
这些不是报错项,而是“看着正常、查不到数据”的隐形炸弹:
-
$name必须写在$table之前,且中间不能有空行或注释;只设$table不设$name会直接报错 -
$pkType必须显式声明为'int'或'string',否则belongsTo关联永远为空,且无提示 -
find()查不到时返回null,不是false;所有if ($data === false)或if (!$data)都得改成if (is_null($data))
不复杂但容易忽略:把旧项目当“黑盒”硬搬,不如拿官方 composer create-project topthink/think tp8-base 新建个干净项目,当成标尺,一行行比对结构、配置、调用方式。老鸟真正快的地方,不在写得多,而在停得准、判得清。











