ThinkPHP 6升级需满足PHP≥7.1.0及mbstring、json、openssl、fileinfo扩展;配置结构改为模块化+.env优先;控制器/中间件需严格类型声明;view和multi-app需手动安装;容器与Db调用方式重构。

PHP版本和扩展要求不满足直接报错
TP6强制要求PHP ≥ 7.1.0,且必须启用mbstring、json、openssl、fileinfo(尤其PHP 8+环境下漏掉fileinfo会导致模板/上传类功能异常)。升级前不检查,运行时大概率卡在composer install或首次访问就抛出Class 'Mime\Type' not found这类错误。
- 用
php -m | grep -E "mbstring|json|openssl|fileinfo"快速核对 - Windows用户注意:php.ini里
extension=php_fileinfo.dll默认常被注释,需手动开启 - 如果项目跑在Docker里,确认基础镜像已包含这些扩展,别只改
php.ini
配置文件结构和加载逻辑全变了
TP5的config.php单文件模式在TP6里彻底废弃,所有配置按模块拆进config/目录,且新增.env环境文件优先级最高。老项目直接复制config.php过去会静默失效——框架根本不会读它。
-
config/app.php里不再有'default_module',改用'app_multi' => true配合多应用开关 -
'empty_controller'这类键名已移至config/app.php,但值必须是类名字符串,如'empty_controller' => 'Error',不是'error' -
.env中写APP_DEBUG=true,比在PHP配置里设app_debug更可靠;数据库密码含特殊字符时,必须用双引号包裹:DB_PASSWORD="p@ss#word!"
控制器方法签名强制类型声明
TP6开启严格模式后,控制器方法若没写参数类型和返回类型,调用时可能不报错但返回值错乱——比如return json(...)实际返回string却被当成Response对象处理,导致HTTP头重复发送。
- 必须给
Request参数加类型:public function index(<code>Request$request): \think\response\Json - 模型查询结果不能直接
return $user,要显式包装:return json(['data' => $user]);或使用success()助手函数 - 中间件
handle()方法签名也变了:public function handle(Request $request, \Closure $next): Response,漏掉Response返回类型会导致协程下响应体丢失
模板引擎和多应用支持要手动补装
TP6默认不带view组件,也不原生支持多应用——这两块在TP5里是开箱即用的。升级后发现fetch()报错或app\index\controller\Index找不到,八成是忘了装扩展。
立即学习“PHP免费学习笔记(深入)”;
- 装模板引擎:
composer require topthink/think-view,再在config/app.php里加'view_replace_str' => [...]等配置 - 多应用必须装
think-multi-app:composer require topthink/think-multi-app,否则app/index这种路径路由直接404 - 多应用下,各应用的配置文件得放
app/index/config/下,不是统一扔根config/里
Container::get('db')变成app('db'),或者Db::name()返回对象而非静态代理——背后是整个依赖注入生命周期的重构。跳过文档直接改代码,大概率修好一个报错,冒出三个新Warning。











