升级ThinkPHP需按环境验证→依赖隔离→结构映射→渐进适配四步闭环操作:先确认版本为v6.0.x/v6.1.x且PHP≥8.0,清空runtime目录;以TP8基准项目为标尺,逐项迁移控制器、模型、模板、配置;重写路由与中间件,替换Request调用方式,并将Db查询结果转toArray或改用模型查询。

升级ThinkPHP时原有代码怎么最大程度保留——不是靠跳过检查、硬覆盖文件或赌运气,而是通过环境验证→依赖隔离→结构映射→渐进适配四步闭环,在不破坏业务逻辑的前提下让老代码在新框架中跑起来。
先确认你站在哪块地基上
执行php think version,输出必须是v6.0.x或v6.1.x;若显示v5.1.41,说明你根本没升到6.0,得先补完6.0迁移再谈8.0。这一步跳过,后续所有“保留代码”操作都会失效。
用php -v查CLI版本,再新建info.php写入访问查看Web SAPI版本,两者必须同时≥8.0.0。常见陷阱是CLI为8.2而php-fpm为7.4,此时composer update成功,但浏览器访问直接500。
【务必删掉整个runtime/目录】——缓存不清理,升级后90%的路由404、配置读取失败都源于此。
用TP8基准项目当标尺,反向映射目录与类引用
在空目录执行:composer create-project topthink/think tp8-base。安装完成后进入tp8-base目录,用ls -la观察结构:你会看到app/、config/、runtime/,但没有application/。
打开composer.json,抄下这三行关键依赖:
"topthink/framework": "^8.0""topthink/think-orm": "^3.0""topthink/think-filesystem": "^2.0"
这个新项目就是你的“黄金标尺”,后续每一步都要回来对照:文件在哪?类怎么引用?配置怎么加载?
分阶段迁移代码,拒绝一次性硬搬
第一步:把原项目Application/Home/Controller/下的控制器逐个复制到app/index/controller/,同时把命名空间从Home\Controller\IndexController改为app\index\controller\Index。
第二步:模型类不能直接拷贝。原Application/Common/Model/UserModel.class.php要重构成app/index/model/User.php,且必须继承think\Model as BaseModel,并显式声明class User extends BaseModel。
第三步:模板文件从View/default/移到resources/views/,并把$this->display('index')全部替换成return view('index');若用fetch(),需确认已启用think\facade\View。
第四步:旧版config.php中的自定义配置(如支付密钥、API地址)不能直接丢进config/custom.php就完事。必须在app/bootstrap.php开头添加:think\facade\Config::load(__DIR__ . '/../config/custom.php', 'custom');,否则Config::get('custom.pay_key')永远返回null。
路由与中间件必须重写,不能复用旧逻辑
方法一:删除route/route.php中所有TP5.x风格的Route::get('index', 'index/index')写法,改用完整类方法路径:Route::get('index', [\app\controller\Index::class, 'index']);
方法二:中间件不再通过middleware.php全局绑定,改用Route::middleware()显式附加,例如:Route::get('user/:id', [\app\controller\User::class, 'read'])->middleware(\app\middleware\Auth::class);
注意:TP8中Request::instance()已废弃,所有input()、param()调用必须改为request()->param('id')或注入think\Request实例,否则参数为空。
数据库查询必须做类型适配
原Db::table('user')->where('id', 1)->find()返回数组,TP8返回think\model\Pivot或think\model\Relation实例,直接json_encode()会出错或漏字段。
方案一:加->toArray(),如Db::name('user')->where('id', 1)->find()->toArray();
方案二:改用模型查询,User::where('id', 1)->find()?->toArray(),更安全且自动触发模型事件;
【Db::table()在某些场景下会绕过模型事件】,TP8更推荐用模型操作而非原生Db查询。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











