将 array_key_exists() 替换为 PHP 中的 isset()

Replacing array_key_exists() with isset() in PHP

知道array_key_exists()isset()在PHP中的区别,我看到网上很多拥护者建议用isset()代替array_key_exists() , 但我在想 安全 这样做吗?

在一个项目中,我有用户提交的$var的值。该值可以是任何值,甚至可以是 NULL 或根本未设置。我想使用 !empty($var) 来检查 $var 是否包含非空值,但我知道单独使用 !empty($var) 是危险的,因为 if $var 不是预定义的, PHP 会抛出错误。

所以我有 isset($var) && !empty($var) 用于检查 $var 是否包含非空值。

但是,当我将值存储在关联数组中时,事情就变得复杂了。比较以下内容,假设数组 $arr 始终存在,但键 foo 可能存在也可能不存在 $arr.

// code snipplet 1
$arr = array();
echo isset($arr['foo']);

// code snipplet 2
$arr = array();
echo array_key_exists('foo', $arr) && !is_null($arr['foo']);

代码片段 2 将始终有效,但它看起来笨拙且难以阅读。至于code snipplet 1,我的体验很差......我以前在开发机器上写过类似的东西。它 运行 很好,但是当我将代码部署到生产机器时,它抛出错误只是因为数组中不存在键。经过一些调试,我发现 PHP 配置在开发机器和生产机器之间是不同的,它们的 PHP 版本也略有不同。

所以,我在想 安全 只是用 isset() 替换 array_key_exists() 真的吗?如果没有,代码片段 2 的更好替代方案是什么?

In one project, I have the value of $var submitted by users.

这是如何运作的?用户不应设置 变量 。例如,他们应该能够提交以 $_POST 结尾的表单值。我再说一遍,他们不应该直接在你的范围内创建变量

如果这里的 "users" 表示某种插件系统,人们可以在其中编写 include PHP 代码……那么您可能需要考虑定义一个比设置变量更稳定的接口。

The value can be anything, even NULL…

如果它是通过 HTTP 提交的值,则不是。 HTTP 没有 null 的概念。它要么是一个空字符串,要么根本不存在。

using !empty($var) alone is dangerous since if $var isn't pre-defined, PHP will throw an error

这是错误的。 empty 特别是 的存在是为了在不抛出错误的情况下根据 false 测试变量。 empty($var)!$var 相同 如果变量不存在则不会触发错误。

So I have isset($var) && !empty($var) for checking whether $var holds a non-empty value.

参见 Why check both isset() and !empty()。 (剧透:这是多余的。)

echo isset($arr['foo']);
echo array_key_exists('foo', $arr) && !is_null($arr['foo']);

它们的作用完全相同。 isset returns true 如果该值存在且其值不是 null。第二行returns true 如果数组键存在且其值不是null。一样的。

I had bad experience...

您需要对此进行更详细的说明,因为您描述的 isset 应该没有任何警告。

参见 The Definitive Guide To PHP's isset And empty and Difference between isset and array_key_exists