Menu

PHP isset():检查变量或数组键是否已设置

变量存在且不为 null 时,isset($var) 返回 true,否则返回 false,而且不会产生任何警告。它也可以检查数组键和对象属性:isset($user['email'])。学习用 isset 检查多个变量、嵌套键,isset 与 empty、isset 与 array_key_exists 的区别,以及检查表单是否提交。

本页包含可运行的编辑器。编辑、运行,立即查看输出。

如果变量存在且它的值不是 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
Point at or tap a cell to read it as PHP.
$xissetemptyis_nullbool
null
false
0
"0"
""
" "
[]
"a"
1
0.0
"0.0"
Every cell computed by PHP 8.3.19.

需要记住的规律:

  • 只有 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 更简短,也稍微快一点。

Coddy 编程语言插图

和 Coddy 一起学编程

开始