升级前必须检查三个兼容性断点:1. think\container构造参数签名变更,需改用container::getinstance();2. cache默认驱动变为null,须显式配置default;3. str::snake()等对空值返回false,需校验入参。

升级前必须检查的三个兼容性断点
ThinkPHP 6.x 升级到 7.x(或 6.3 → 6.4)不是“改个 composer.json 就完事”。最常崩在底层契约变更:think\Container 的构造参数签名变了,think\facade\Cache 默认驱动从 File 切到 Null,还有 think\helper\Str 里 snake() 和 kebab() 对空字符串和非字符串输入的返回值逻辑收紧。这些不会报错,但缓存不生效、路由生成异常、字段名转换出错——现象是“功能看似正常,数据偶尔丢”。
- 检查所有自定义中间件中是否直接 new
think\Container,改为用Container::getInstance() - 查看
config/cache.php是否显式配置了default,没配就默认用null驱动(相当于关缓存) - grep 项目里所有
Str::snake()调用,确认入参是否可能为null或数字,TP7 会直接返回false而非空字符串
vendor 更新后启动报错 Class 'think\Facade' not found 怎么办
这不是类没加载,是自动加载映射失效。TP6.3+ 启用了更严格的 PSR-4 自动加载规则,而很多老项目在 composer.json 里还留着旧版 "psr-4": {"app\": "app/"} 配置,但 TP7 要求 app 目录下必须有 BaseController.php 等标准骨架文件;如果目录结构是手工维护的(比如删过 app/common.php 或改过命名空间),Composer dump-autoload 就会跳过整个 app 命名空间。
- 运行
composer dump-autoload -o后,立刻执行php think clear清掉所有运行时缓存 - 检查
app/下是否存在BaseController.php且命名空间是app\BaseController;不存在就补一个空类(哪怕只写<?php namespace app; class BaseController {}) - 如果用的是自定义应用类(如继承
think\App),确认其initialize()方法里没调用已废弃的$this->bind()—— TP7 已移除该方法
数据库查询结果突然变 null:PDO fetch mode 改变了
TP6.3 默认用 PDO::FETCH_ASSOC,TP6.4+(尤其 TP7)在开启严格模式(app_debug = true)时,对 query() / execute() 返回值做类型校验,若 PDOStatement->fetch() 返回 false(比如无结果或连接中断),旧版本返回空数组,新版本直接返回 null。线上查不到数据却没报错,就是这个原因。
- 所有裸调
$db->query()的地方,必须加判空:if (null === $result) { throw new Exception('DB query failed'); } - 不要依赖
count($result)判是否有数据,改用is_array($result) && !empty($result) - 若用
Db::table()->select(),不受影响;但手写 SQL +query()就得自己兜底
为什么 vendor 更新后日志不写了?
TP7 把日志驱动初始化时机提前到了容器构建阶段,而老项目常在 app/common.php 或中间件里手动调用 Log::init()。这会导致两次初始化冲突,第二次覆盖第一次,且新实例没绑定到容器,最终 Log::write() 写进了一个没配置路径的哑驱动。
- 删除所有手动
Log::init()调用,只保留config/log.php中的配置项 - 检查
log.php里的default是否指向有效驱动(如file),并确认channels.file.path是绝对路径(相对路径在 TP7 下会被忽略) - 若用 Swoole 长连接,需额外设置
channels.file.flush_request = false,否则每次请求都 flush 日志文件句柄,性能暴跌
迁移真正卡点不在语法,而在那些没报错的“静默降级”——缓存失效、日志消失、SQL 结果变 null、命名空间加载跳过。这些全靠 grep + 日志 + 本地 debug 断点一个个抠,自动化工具基本帮不上忙。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!










