param() 能解决90%参数获取需求,自动合并$_GET、$_POST和路由变量并按优先级取值;需注意默认值、类型后缀、嵌套点号等用法,避免直接读超全局变量。

param() 能解决 90% 的参数获取需求
绝大多数接口和表单场景下,你根本不需要区分参数来自 GET 还是 POST —— param() 会自动合并 $_GET、$_POST 和路由变量,按优先级(POST > GET > route)取值,省去手动判断请求类型。
常见错误是写成 input('id') 却没指定来源,结果在 POST 请求里误取到 GET 中同名参数;或者用 input('data.') 想批量取子数组却漏了末尾点号,导致取不到数据。
-
$id = $request->param('id'):不存在时返回null,不会触发 Notice -
$id = $request->param('id', 0):指定默认值,避免空值引发逻辑异常 -
$id = $request->param('id/d', 1):带类型后缀,非法输入(如id=abc)直接转为0,比(int)更安全 -
$data = $request->param('user.'):末尾点号必须保留,否则无法递归提取user[name]、user[age]等嵌套结构
什么时候必须用 get() 或 post() 显式隔离来源
当框架自动合并行为会干扰业务逻辑时,才需要显式指定来源。比如前端同时支持 URL 查询和表单提交,且要求 URL 参数不可被 POST 覆盖(如分页 ?page=2 必须生效),这时 param('page') 就可能出错。
get() 和 post() 不仅限于传统 GET/POST 请求:它们对 PUT、DELETE 等方法也有效,但只读取对应原始来源($_GET 或 $_POST),不处理 JSON body 或 multipart 表单中的非文件字段。
立即学习“PHP免费学习笔记(深入)”;
-
$page = $request->get('page'):只从 URL 查询串取,哪怕 POST 提交了同名字段也不影响 -
$content = $request->post('content/s'):/s后缀只对 POST 数据生效,对 GET 无效 —— 类型过滤是按来源绑定的 - 表单
enctype="multipart/form-data"提交时,$request->param()会忽略所有文件字段,但$request->post()仍能取到普通文本字段
input() 助手函数 vs request()->xxx 方法
input() 是全局助手函数,本质是封装了 Request 对象调用,语法更紧凑;而 $request->param() 等是面向对象写法,适合依赖注入或需复用请求实例的场景。两者能力完全一致,选其一保持项目统一即可。
注意:input('name') 默认行为是自动探测(等价于 param()),不是只读 GET;而 input('post.name') 才强制限定来源。新手常误以为 input('name') 就是 GET,其实它优先取 POST。
-
input('id')≡$request->param('id') -
input('post.id')≡$request->post('id') -
input('get.name/s')≡$request->get('name', '', 'htmlspecialchars') - 不要混用:同一控制器里别一会儿用
input()一会儿用$request->get(),容易遗漏过滤规则或默认值逻辑
绝对不能直接用 $_GET 或 $_POST
绕过框架直接读 $_GET['id'] 或 $_POST['name'],等于放弃所有安全防护:没有默认值兜底、没有类型转换、没有 XSS 过滤、不支持嵌套数组解析,还可能因参数缺失触发 Notice: Undefined index。
尤其在 RESTful 接口或小程序场景中,前端可能用 fetch + JSON body 发送数据,此时 $_POST 为空,但 $request->param() 仍能通过中间件解析出 JSON 内容 —— 直接读超全局变量会彻底收不到数据。
- JSON 请求体(
Content-Type: application/json)需框架中间件解析,$_POST始终为空,$request->param()可正常取值 -
$_GET和$_POST不经过任何过滤,恶意构造的?id=<script>alert(1)</script>会原样透出 - 数组参数如
user[name]=a&user[age]=b,$_POST['user']是字符串而非数组,$request->param('user.')才能正确解析
真正容易被忽略的是类型后缀的绑定逻辑:同一个 /d 后缀,在 param('id/d') 和 post('id/d') 中的行为一致,但在 get('id/d') 中,它只对 URL 查询串生效 —— 如果你写了 get('id/d') 却传了 ?id=abc,结果仍是 0;但如果传了 ?id=123abc,框架会截断取整,而不是报错或丢弃。



















