isset()仅检查变量是否已声明且不为NULL,空字符串、0、false等均返回true;empty()则判断值是否为布尔假,包括''、0、false、null、[]和"0"。

因为 isset() 不判断“空”,只判断“是否已声明且不为 NULL”。 空字符串 '' 是合法值,不是 null,所以 isset('') 必然返回 true。
isset() 的真实职责是“变量存在性检查”,不是“非空校验”
它只关心两件事:变量有没有被声明(或赋值过),以及当前值是不是 PHP 的 null 常量。只要不是 null,哪怕值是 ''、0、false、array() 或 "0",都算“已设置”。
常见误解场景:
- 用
isset($_GET['q'])判断用户是否提交了搜索词,但实际传了?q=(空字符串)→ 仍返回true - 用
isset($data['email'])防止 Notice,却没意识到$data['email'] = ''时逻辑仍会往下走 - 多参数调用如
isset($_POST['name'], $_POST['email']),只要两个都非null就过,不管它们是不是空字符串
什么时候该用 empty() 而不是 isset()?
当你真正想表达“这个值不能是空、0、false、null 或空数组”时,empty() 更贴切。它的判定等价于 !$var(隐式布尔转换为 false 的所有情况)。
立即学习“PHP免费学习笔记(深入)”;
对比示例:
$var = ''; var_dump(isset($var)); // true var_dump(empty($var)); // true var_dump($var === ''); // true(精确匹配空字符串)
注意:empty() 对未定义变量不会报 Notice,这点和 isset() 一样安全;但它对 "0" 也返回 true,这是设计行为,不是 bug。
$_GET / $_POST 参数校验的推荐组合
单纯防 Notice 用 isset();要过滤无效输入,得叠加语义判断:
- 检查是否传参且非空:
isset($_GET['id']) && $_GET['id'] !== '' - 检查是否为有效数字:
isset($_GET['page']) && ctype_digit($_GET['page']) - 检查是否为非空字符串(排除 "0"):
isset($_GET['term']) && trim($_GET['term']) !== '' - 需要兼容
"0"这种合法值?那就别用empty(),改用strlen(trim($x)) > 0
最易被忽略的一点:isset() 在多维数组中访问深层键时,会静默失败(比如 isset($arr['a']['b']['c']) 中任意一级是字符串而非数组,就直接返回 false),但它不会报 Warning —— 这让问题更难定位。



















