isset()检测变量是否已声明且不为NULL,empty()判断值是否为PHP“空”(含未定义变量),is_null()严格判定已定义变量值是否为NULL;三者逻辑差异决定适用场景。
如果您在PHP开发中需要判断变量的状态,却对isset、empty与is_null的适用场景感到困惑,则可能是由于三者在变量存在性、空值定义和NULL判定上的逻辑差异未被清晰区分。以下是三种函数的核心区别与具体应用方式:
一、isset():检测变量是否已声明且不为NULL
isset()用于确认变量是否已被设置(即已声明并赋予了非NULL值)。它对未定义变量、被unset()的变量或显式赋值为NULL的变量均返回FALSE,仅当变量存在且值明确不为NULL时才返回TRUE。该函数支持多参数,全部满足条件才返回TRUE。
1、定义一个变量并赋值为NULL:
$var = NULL;
2、调用isset()检测:
var_dump(isset($var)); // 输出 bool(false)立即学习“PHP免费学习笔记(深入)
”;
3、定义一个整数变量:
$num = 0;
4、再次调用isset():
var_dump(isset($num)); // 输出 bool(true)
5、检测未声明变量:
var_dump(isset($undefined)); // 输出 bool(false)
二、empty():检测变量是否“空”(等价于布尔假)
empty()不关心变量是否已定义,而是直接判断其值是否属于PHP认定的“空”范畴。若变量未定义,empty()会将其视为已存在且值为NULL,从而返回TRUE;若变量存在但值为""、0、"0"、FALSE、array()、NULL或仅声明未赋值的变量,同样返回TRUE。
1、声明但未赋值的变量:
$a;
2、使用empty()检测:
var_dump(empty($a)); // 输出 bool(true)
3、赋值为字符串"0":
$b = "0";
4、检测结果:
var_dump(empty($b)); // 输出 bool(true)
5、赋值为浮点数0.0:
$c = 0.0;
6、检测结果:
var_dump(empty($c)); // 输出 bool(true)
三、is_null():严格判定变量值是否为NULL
is_null()仅关注变量的值是否严格等于NULL,不处理未定义变量——传入未定义变量将触发Notice警告并导致致命错误。它要求变量必须已声明,且值必须是NULL类型,其他任何值(包括0、FALSE、"")均返回FALSE。
1、显式赋值为NULL:
$x = NULL;
2、调用is_null():
var_dump(is_null($x)); // 输出 bool(true) PHP 8.5.5 PHP 8.5.5 是 PHP 8.5 分支的维护更新版本。该版本延续了“小步快跑”的迭代逻辑,通过深度错误修复、底层性能微调以及安全加固,旨在为开发者提供一个更健壮、更高效的运行环境。该版本严格遵守语义化版本规范,不包含破坏性变更。
下载
3、赋值为FALSE:
$y = FALSE;
4、检测结果:
var_dump(is_null($y)); // 输出 bool(false)
5、尝试检测未定义变量:
var_dump(is_null($z)); // 触发 Notice: Undefined variable
四、三者行为对比的关键边界情况
当变量值为0、FALSE、""、array()时,empty()统一返回TRUE;而isset()在这些情况下只要变量已定义就返回TRUE;is_null()则仅在值为NULL时返回TRUE。特别注意:isset($var)为FALSE时,$var可能未定义、被unset()或被赋为NULL;而is_null($var)为TRUE时,$var一定已定义且值为NULL。
1、定义变量为0:
$val = 0;
2、分别检测:
var_dump(isset($val), empty($val), is_null($val)); // 输出 bool(true) bool(true) bool(false)
3、定义变量为NULL:
$val = NULL;
4、再次检测:
var_dump(isset($val), empty($val), is_null($val)); // 输出 bool(false) bool(true) bool(true)
5、仅声明未赋值:
$val;
6、检测结果:
var_dump(isset($val), empty($val), is_null($val)); // 输出 bool(false) bool(true) 触发Notice
五、安全检测组合建议
在实际开发中,单独使用任一函数都可能存在误判风险。例如,需确认变量存在、非空且非NULL时,可组合使用isset()与!empty();若需排除未定义变量干扰并精确识别NULL值,则应在is_null()前先用isset()兜底。
1、安全检测已定义且非空:
if (isset($var) && !empty($var)) { /* 安全执行 */ }
2、安全检测是否为NULL:
if (isset($var) && is_null($var)) { /* 确认为NULL */ }
3、检测未定义或为NULL的统一情形:
if (!isset($var)) { /* 包含未定义和NULL两种情况 */ }
4、检测变量存在但值为NULL的精确路径:
if (isset($var) === false || is_null($var)) { /* 显式分离逻辑 */ }
5、避免对未定义变量直接调用is_null():
if (isset($var) && is_null($var)) { /* 先保底再判定 */ }
