
在 php 中,`isset()` 和 `empty()` 无法区分 `?param=`(参数存在且值为空字符串)和 `?param`(参数存在但无等号、无值,即未声明)——实际上,这两种情况在标准 php 解析中**均不会出现在 `$_get` 数组中**;真正能被 `$_get` 捕获的只有 `?param=value` 或 `?param=`,而 `?param`(无等号)默认不进入 `$_get`。因此,要准确识别 `?param=` 与 `?param`,必须直接解析原始查询字符串。
要实现题中需求——严格区分以下两种 URL 场景:
- ?param= → 参数键存在,且显式赋值为空字符串($_GET['param'] === '',isset($_GET['param']) 为 true)
- ?param → 参数仅以键名形式出现,无 = 号(此时 $_GET['param'] 根本不存在,isset() 返回 false)
⚠️ 关键前提:PHP 的 $_GET 超全局数组由 CGI/服务器解析层生成,其行为遵循 RFC 3986 和 Web 服务器实现。绝大多数服务器(如 Apache、Nginx + PHP-FPM)默认不将 ?param 解析为 $_GET['param'] => '',而是完全忽略该键——也就是说,?param 在 $_GET 中根本不可见。
因此,若你观察到 ?param 确实触发了 isset($_GET['param']),那很可能是前端 JavaScript 手动拼接、或后端重写规则(如 .htaccess)导致异常解析,不属于 PHP 原生行为。
✅ 正确检测方案:结合 $_GET 与原始 QUERY_STRING
立即学习“PHP免费学习笔记(深入)”;
✅ 参数 "param" 显式声明但无 "=" 号(如 ?param)











