isset($_GET['key'])最快但无法区分空字符串与未传参;Laravel中应统一用$request->has('key'),避免混用$_GET;取值推荐空合并运算符??。

直接用 isset($_GET['key']) 最快,但要注意它对 null 和空字符串的判断逻辑不一致;Laravel 项目里优先用 $request->has('key'),别混用 Request::has() 和全局 $_GET。
用 isset() 判断 $_GET 参数是否存在
isset() 是最轻量、无需框架依赖的方式,适合原生 PHP 或简单脚本。它只认「变量已声明且不为 null」,所以:
-
$_GET['id'] = ''→isset($_GET['id'])返回 true -
$_GET['id'] = null→ 返回 false - URL 中根本没传
id→ 也返回 false
常见错误是把它和「非空校验」混为一谈。比如写 if (isset($_GET['name'])) { echo $_GET['name']; } 能防报错,但输出可能是个空字符串,业务上未必可接受。
用 array_key_exists() 区分「未传」和「传了但为空」
如果必须严格区分「参数没出现」和「参数值为空字符串」,array_key_exists('key', $_GET) 更准确:
立即学习“PHP免费学习笔记(深入)”;
-
https://a.com/?name=→array_key_exists('name', $_GET)是 true -
https://a.com/(无name)→ 返回 false
注意:array_key_exists() 不检查值是否为 null,只看键在数组中是否存在。性能略低于 isset(),但语义更清晰。
Laravel 中统一用 $request->has(),别碰 $_GET
在 Laravel 控制器方法里,$request 对象已经封装了所有输入,$request->has('id') 是标准做法:
- 自动兼容 GET/POST/JSON 请求体,不绑定 HTTP 方法
- 支持批量判断:
$request->has(['id', 'type']) - 不能在路由闭包外直接用
Request::has(),除非手动use Illuminate\Http\Request - 绝对不要在 Laravel 里混用
$_GET和$request—— 它们可能被中间件修改过(比如加了 XSS 过滤),行为不一致
安全获取值:用空合并运算符 ?? 替代三元判断
要取值又不想写冗长的 isset() 判断,PHP 7+ 推荐用 ??:
$id = $_GET['id'] ?? 0;
$name = $request->input('name') ?? 'guest';
它等价于「存在且不为 null 就取值,否则给默认值」,比 isset($x) ? $x : $y 简洁,且不会触发未定义索引警告。但注意:?? 不处理空字符串或 0 这类「falsy」值 —— 这是它的设计意图,不是 bug。
最容易被忽略的是:框架层(如 Laravel)的 $request 可能经过验证器、中间件或表单请求类的预处理,$_GET 始终反映原始 URL 查询串。调试时如果发现参数“明明传了却读不到”,先确认你查的是哪一层的数据源。



















