ThinkPHP 6.0+ 中 input() 被移除,需改用 request()->param() 等方法替代;文件上传必须用 request()->file();类型转换推荐验证器而非手动 cast;可临时封装 input() 但不推荐。

ThinkPHP 6.0+ 中 input() 被移除,直接用 request()->param() 替代
ThinkPHP 6.0 开始彻底移除了全局助手函数 input(),它不再自动注入、也不再支持魔术参数(如 input('id/d') 这类类型转换)。最直接的替代方式就是调用 Request 对象的 param() 方法,但要注意行为差异。
常见错误现象:升级后代码里还写 input('name'),直接报 Call to undefined function input()。
-
request()->param()默认只获取 GET + POST + PUT + PATCH + DELETE 的合并参数(不含 FILE),和旧版input()行为基本一致 - 若需指定来源(比如只取 GET),用
request()->get('name')、request()->post('name')等更明确的方法 -
param()不做自动类型转换(如/d、/s后缀),需要手动 cast:(int) request()->param('id')或用验证器
需要类型转换或过滤时,优先走验证器而不是手写 filter_var
以前用 input('age/d') 获取整数、input('content/s') 获取字符串,现在这些语法失效。硬编码类型转换容易漏判、难维护,尤其涉及数组、嵌套数据时。
使用场景:表单提交、API 参数解析、URL 查询参数清洗。
立即学习“PHP免费学习笔记(深入)”;
- 定义验证规则(如
app\validate\UserValidate),在控制器中调用$this->validate($data, 'UserValidate') - 验证器内可写
'age' => 'require|number|between:1,120',比(int)更安全 - 若只是简单转换且不想建验证器,可用
request()->param('age', 0, 'intval')—— 第三个参数是过滤回调,支持内置函数名或闭包
input('file') 这类文件获取必须改用 request()->file()
旧版 input('upload_file') 可能返回 think\File 实例,但这是不稳定的副作用;6.0+ 中文件上传必须显式调用 file() 方法,否则拿不到上传对象。
错误现象:用 input('avatar') 获取上传文件,结果是空字符串或 null,moveTo() 报错。
-
$file = request()->file('avatar')返回think\File实例,可直接->move() - 若传的是数组型字段(如
photos[]),用request()->file('photos')得到数组,遍历处理 - 注意:不能对
file()结果再套param()或验证器规则(验证器默认不处理文件对象)
全局兼容方案:自己封装一个 input() 助手函数(慎用)
如果项目量大、改造成本高,可临时重建 input(),但别照搬旧逻辑——新版 Request 已不支持魔术后缀,强行模拟反而增加维护负担。
性能影响:每次调用都 new Request 或 get instance,开销微乎其微;但长期看,掩盖了接口演进意图,不利于后续升级。
- 在
app/common.php中定义:function input($key = '', $default = null, $filter = '') { $request = \think\Request::instance(); if (false === strpos($key, '/')) { return $request->param($key, $default, $filter); } // 拆分 key/filter,仅支持 /d /s /a 等简单后缀,不推荐扩展复杂逻辑 [$k, $type] = explode('/', $key, 2); $val = $request->param($k, $default); switch ($type) { case 'd': return (int) $val; case 's': return (string) $val; case 'a': return is_array($val) ? $val : []; default: return $val; } } - 这种封装只解决“不报错”,但丢失了验证器的语义、错误提示和扩展能力,上线前务必评估是否真有必要
user[profile][age])和数组字段的批量校验逻辑,这些在旧 input() 下隐式工作,现在必须显式声明验证规则或手动递归处理。



















