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)
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)) { /* 先保底再判定 */ }



















