isset() 检测变量是否已声明且不为 NULL,不判断是否为空;如 $_GET['name'] 为 '' 时返回 true,而 $_GET['age'] 未传参时才返回 false。
它**不检测“有没有值”或“是不是空”**,只回答两个问题:这个变量名在当前作用域里是否存在?它的值是不是 PHP 的 NULL?
所以哪怕变量是空字符串 ''、数字 0、布尔 false、甚至字符串 "0",isset() 都返回 true——因为它们都“设置了”,而且不是 NULL。
isset($_GET['name']) 在 URL 为 ?name= 时返回 true(值是 '')isset($_GET['age']) 在 URL 完全没带 age 参数时才返回 false
$x = null;
isset($x) → false;$x = ''; isset($x) → true
直接写 $_GET['fromDate'] 会触发 Notice: Undefined index: fromDate 警告——尤其在表单字段为空提交时,PHP 默认开启错误报告,页面就可能暴露敏感路径或打断逻辑。
isset() 是最轻量、最安全的防御手段,它不会报错,也不改变变量状态,只做判断。
array_key_exists() 略高(语言构造,非函数调用)isset(trim($_GET['q'])) 会解析错误isset($a, $b, $c) 表示“全部存在且非 NULL”,任一不满足立刻返回 false
这是初学者掉进最多次的坑。比如写:
if (isset($_POST['email'])) {
// 认为 email 一定有内容 → 错!可能是 ''
}结果用户提交了空邮箱,代码仍往下走,后续可能插入空数据或跳过验证。
正确做法是组合使用:
isset() 确保键存在(防 Notice)!empty($_POST['email']) 或 trim($_POST['email']) !== '' 判断是否有实际内容$email = $_POST['email'] ?? ''; if ($email !== '') { ... }
面对不同需求,别硬套 isset():
null?→ 用 array_key_exists('key', $arr)
$val = $arr['key'] ?? 'default'
@$_GET['id'],但会掩盖真实问题,且影响性能property_exists($obj, 'prop'),而非 isset($obj->prop)
真正关键的不是记函数,而是分清场景:你是在防未定义?还是防空值?还是防 NULL?三者完全不同。