isset() 最安全,可同时防未定义变量和 null 值且不报 warning;而 $var 或 !$var 会触发 Notice 且将 0、false、"" 等合法值误判为不存在。

用 isset() 判断最安全,它能同时防未定义变量和 null 值,且不报 warning。
为什么不用 $var 或 !$var 直接判断存在性
直接拿变量当布尔值用(比如 if ($var))本质是做类型转换 + 值判断,不是“是否存在”的检测。它会在变量未定义时触发 Notice: Undefined variable;而且像 0、false、"" 这些合法存在的值也会被误判为“不存在”。
-
isset($var)返回false仅当:变量未声明,或已声明但值为null -
$var在未定义时抛 warning,is_null($var)同样会抛 warning -
array_key_exists('key', $arr)只适用于数组键,不能用于普通变量
isset() 和 array_key_exists() 的适用边界
isset() 是通用变量存在性检测函数,而 array_key_exists() 只管数组里某个键是否被定义过——哪怕对应值是 null,它也返回 true。
- 检查普通变量(如
$user_id)是否存在且非null→ 用isset($user_id) - 检查数组中某个键(如
$data['email'])是否被设置(包括设为null)→ 用array_key_exists('email', $data) - 想兼顾“变量存在且不为
null”+“数组键存在(哪怕为null)”,得组合写:isset($data['email']) || array_key_exists('email', $data)
常见误用:把 empty() 当存在性检测
empty() 不是存在性检测工具,它是“空值语义”判断器:对 0、"0"、false、[]、"" 都返回 true,还会把未定义变量当作空处理(不报 warning,但掩盖了变量缺失问题)。
立即学习“PHP免费学习笔记(深入)”;
- 需要知道
$page是否传入且可用?→isset($page) - 需要知道
$page是否为有效页码(非 0、非负、整数)?→is_numeric($page) && (int)$page > 0 - 误写成
!empty($page):当$page = 0时结果为false,但 0 可能是合法输入(如首页)
真正容易被忽略的是:PHP 没有原生的“只检查是否声明、不管值是什么”的函数。isset() 是最接近的,但它把 null 和未定义一并归为“不存在”。如果业务逻辑明确要求区分“未定义”和“显式赋 null”,就得靠 array_key_exists() 配合 get_defined_vars(),或者自己维护一个已声明变量白名单。



















