isset()判断变量是否已声明且非null;empty()判断变量是否为空(含null、0、""等);is_null()仅检测是否严格等于null;??=和??用于默认值赋值而非判断。

isset() 判断变量是否“已设置且非 null”
这是最常用的判断方式,但它的语义很具体:isset() 只在变量**已声明**且**值不为 null** 时返回 true。它不关心值是不是 0、false、空字符串或空数组——这些都算“有值”,isset() 会返回 true。
常见错误现象:
-
$x = null;→isset($x)是false -
$x = 0;→isset($x)是true(哪怕你认为“0 没有意义”) -
unset($x);后 →isset($x)是false
使用场景:适合检查表单字段、配置项、函数参数是否传入且非空值(排除 null)。
empty() 判断变量是否“空”——语义更宽泛
empty() 不是 !isset() 的反义词,它有自己的判定规则:只要变量未定义、为 null、false、0、"0"(字符串零)、空字符串、空数组,就返回 true。
立即学习“PHP免费学习笔记(深入)”;
容易踩的坑:
-
$x = "0";→empty($x)是true(但isset($x)是true) -
$x = 0.0;→empty($x)是true;而$x = 0.1;→false - 对未声明变量用
empty($undefined)不会报错,但isset()更明确表达“是否存在”的意图
使用场景:适合表单验证中判断用户是否“没填有效内容”,比如用户名、邮箱字段是否为空或无效值。
is_null() 专用于确认是否等于 null
如果你只关心一个变量是不是被显式设为 null,或者想和 null 做严格区分(比如和 0、false),就该用 is_null()。
注意点:
-
$x = null;→is_null($x)是true -
$x = 0;或$x = "";或$x = [];→ 全部返回false - 它不处理未定义变量:
is_null($undefined)会触发Notice: Undefined variable
所以实际中常配合 isset() 一起用,比如:if (isset($x) && is_null($x)) { ... } —— 这能明确捕获“已声明但值为 null”的状态。
??= 和 ?? 适合默认值赋值,不是判断工具
??=(PHP 7.3+)看起来像判断,但它本质是赋值操作符:$x ??= 'default'; 等价于 “如果 $x 是 null 或未定义,就赋值”。它背后仍依赖 isset() + === null 的逻辑,但你不该用它来“取判断结果”。
误用示例:
-
if ($x ??= 'fallback') { ... }—— 这里??=会先改$x,再拿新值做条件,逻辑混乱 - 想判断
$x是否为空字符串???和??=都不管这个,它们只认null和未定义
真正需要判断时,别绕弯,直接选 isset()、empty() 或 is_null() —— 它们的语义清晰,行为可预测。
最易被忽略的一点:PHP 中“未定义变量”和“定义为 null”在 isset() 下表现一致,但它们在调试、序列化、对象属性访问等场景下行为不同。不要只靠一个函数覆盖所有“有没有值”的理解,得看上下文到底在意什么。



















