thinkphp 6.0+ 废弃 request::instance(),应改用门面类 \think\facade\request 或助手函数 request();param() 合并 get/post/route 并过滤空值,但不解析 json 请求体,json 数据需用 input() 或 json(true) 显式获取。

Request::instance()->param() 在 ThinkPHP 6.0+ 已失效
ThinkPHP 6.0 起彻底移除了静态单例模式的 Request::instance(),调用它会直接抛出 Fatal error: Uncaught Error: Call to undefined method think\Request::instance()。这不是配置问题,是框架底层重构导致的硬性废弃。
真正可用的入口是容器注入或助手函数:
- 控制器方法参数自动注入:
public function index(\think\Request $request) - 助手函数
request()(返回当前请求实例) - 门面类
\think\facade\Request(推荐,与 TP5 兼容性较好)
param()、get()、post() 等方法的行为差异
param() 默认合并 GET + POST + Route 参数,且会自动过滤空值(如 null、''、[]),但不处理 JSON 请求体;get() 和 post() 则严格按来源取值,不会合并也不会过滤。
常见踩坑点:
- 用
param('id')获取不到 POST JSON 数据里的id—— 需改用input('id')或json() - 表单提交空字符串时,
param('name')返回null,而post('name')仍返回'' -
param()不识别application/json请求体,必须显式调用json(true)才能解析
TP5 升级到 TP6 的兼容写法
如果老项目大量用了 Request::instance()->param(),又不想逐个改控制器,可以用门面兜底:
// 替换所有 Request::instance()->xxx 为 \think\facade\Request::param() \think\facade\Request::get() \think\facade\Request::post()
注意两点:
- 门面类在 TP6 中默认启用,无需额外配置
- TP5 的
input('name')在 TP6 里行为有变:TP6 的input()默认只读GET/POST,不读路由变量,要读路由需显式写input('name', '', 's')或改用param()
JSON 请求体必须显式解析
TP6 不再自动将 application/json 请求体合并进 param() 或 post(),这是和 TP5 最关键的区别。如果你的接口接收前端 fetch({ method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({a:1}) }),直接 param('a') 会返回 null。
正确做法只有两个:
- 用
input('a')—— 它内部会尝试解析 JSON(但仅限顶层字段) - 用
json(true)获取完整 JSON 数组,再手动取值:$data = \think\facade\Request::json(true); echo $data['a'] ?? null;
别依赖 post() 或 param() 自动处理 JSON,它们真的不会碰请求体。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!










