如果变量存在且它的值不是 null,isset($var) 返回 true。对于未定义的变量、已被 unset 的变量或值为 null 的变量,它返回 false,并且从不打印警告。
isset() 只看某个东西是否存在。一个已设置但为空的值,例如 0、"" 或 [],仍然返回 true。如果你想要“已设置且不为空”,请使用取反的 empty。
用 isset 检查数组键是否存在
这是 isset() 最常见的用法。在常规的 PHP 环境中,读取不存在的键会打印 Warning: Undefined array key;先用 isset() 检查就不会。它也适用于嵌套的键,遇到第一个缺失的层级就会安静地停下。
如果你只需要取值或一个默认值,$user["website"] ?? "none" 一步就能完成同样的检查。参见 空合并运算符。
用 isset 检查多个变量
传入多个参数时,只有当它们全部已设置且不为 null 时,isset() 才返回 true。这是检查所有必填字段是否都已提交的简便方法。
对字符串和对象使用 isset
对字符串使用时,isset($str[5]) 检查偏移量 5 处是否有字符,可以快速检查长度。对对象使用时,它检查一个属性;对于带有私有数据的类,如果类定义了 __isset() 方法,isset() 会调用它。
isset、empty 与 is_null 的区别
在表格中选择 $x 的一个值,比较这三种检查以及直接的 (bool) 转换。每个单元格都由 PHP 8.3 计算得出。
| $x | isset | empty | is_null | bool |
|---|---|---|---|---|
| null | ||||
| false | ||||
| 0 | ||||
| "0" | ||||
| "" | ||||
| " " | ||||
| [] | ||||
| "a" | ||||
| 1 | ||||
| 0.0 | ||||
| "0.0" |
需要记住的规律:
- 只有
null和不存在的东西会让isset()为false。 - 对于这些情况,以及所有假值(
false、0、0.0、""、"0"、[]),empty()都为true。 - 对于已存在的变量,
is_null()的结果与isset()相反,但变量未定义时它会发出警告。请改用isset()或=== null。
检查表单是否已提交
isset() 是判断某个表单字段是否提交的经典方法。运行这段代码,输入一个名字,然后点击 Send:同一个脚本会再次运行,这时 $_POST 已经有了数据。
空的文本框仍然会被提交,值为 "",所以任何一次提交之后 isset($_POST["name"]) 都为 true。未勾选的复选框根本不会被提交,因此 isset() 正好适合用来检查复选框。如果要求值不能为空,就像这段代码那样检查去掉首尾空白后的字符串。表单页面 会构建一个带验证的完整表单。
isset 与 array_key_exists 的区别
两者除了值为 null 的键之外,结果全都一致。isset() 把这种键当作不存在,array_key_exists() 则不会。
如果在你的数据中,“设置为 null”和“未配置”含义不同,就使用 array_key_exists()。否则 isset() 更简短,而且它是语言结构而不是函数调用,所以也稍微快一点。
常见错误:对表达式使用 isset
isset() 只接受变量、数组元素和属性。传入函数的返回值或常量会导致编译错误:
<?php
if (isset(trim($input))) {}
PHP Fatal error: Cannot use isset() on the result of an expression (you can use "null !== expression" instead) in /home/index.php on line 2
先把结果存进一个变量,或者直接检查值本身:按错误信息的建议写 null !== $expr,对字符串则可以写 trim($input) !== ""。
常见问题
PHP 中 isset() 有什么作用?
如果 $x 存在且不为 null,isset($x) 返回 true,否则返回 false。遇到未定义的变量或数组键时它从不发出警告,所以可以放心用于请求数据,例如 isset($_POST['email'])。
PHP 中 isset() 和 empty() 有什么区别?
isset() 问的是“它存在且不为 null 吗”;empty() 问的是“它不存在或者是假值吗”。对于 0、""、"0" 和 [],isset() 返回 true,empty() 也返回 true。对于 null 或不存在的键,isset() 为 false,empty() 为 true。!empty($x) 等同于 isset($x) && $x 为真值。
isset() 可以同时检查多个变量吗?
可以:只有当每一个都已设置且不为 null 时,isset($a, $b, $c) 才返回 true。遇到第一个未设置的变量就会停止。
应该用 isset() 还是 array_key_exists()?
只有当键存在但值为 null 时,两者才有区别:isset($arr['k']) 返回 false,array_key_exists('k', $arr) 返回 true。当 null 是一个有意义的存储值时使用 array_key_exists;否则 isset 更简短,也稍微快一点。