将 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。
知道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。