了解PHP中array_key_exists()
和isset()
的差异,我看到很多网络上的支持者建议用array_key_exists()
替换isset()
,但我在想的是 安全 这样做了吗?
在一个项目中,我有用户提交的$ var的值。值可以是任何值,甚至是NULL或根本不设置。我想使用!empty($var)
检查$var
是否包含非空值,但我了解单独使用!empty($var)
是危险的,因为如果$var
未预先定义,PHP会抛出错误。
所以我isset($var) && !empty($var)
检查$var
是否包含非空值。
但是,当我在一个assoc数组中存储一个值时,事情变得复杂了。比较以下内容,假设数组$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']);
Code snipplet 2 将始终有效但看起来笨拙且难以阅读。至于代码snipplet 1 ,我的经历很糟糕......我以前在开发机器上写过这样的东西。它运行正常,但是当我将代码部署到生产机器时,它只是因为键不存在于数组中而引发错误。经过一些调试后,我发现PHP配置在开发和生产机器之间是不同的,它们的PHP版本略有不同。
所以,我认为用array_key_exists()
替换isset()
真的是安全吗?如果没有,那么代码snipplet 2 的更好替代方案是什么?
答案 0 :(得分:1)
在一个项目中,我有用户提交的$ var值。
这是如何工作的?用户不应该能够设置变量。他们应该能够,例如,提交最终在$_POST
中的表单值。我再说一遍,他们不应该直接在你的范围内创建变量。
如果“users”在这里意味着人们编写的某种插件系统和include
PHP代码......那么你可能想要考虑定义比设置变量更稳定的接口。
值可以是任何值,甚至是NULL ......
如果它是通过HTTP提交的值,则不会。 HTTP没有null
的概念。它可以是空字符串,也可以根本不存在。
单独使用
!empty($var)
是危险的,因为如果$var
未预定义,PHP将引发错误
那是错的。 empty
具体存在以针对 false 测试变量而不会引发错误。如果变量不存在,则empty($var)
与!$var
相同而不会触发错误。
所以我
isset($var) && !empty($var)
检查$var
是否包含非空值。
见Why check both isset() and !empty()。 (剧透:这是多余的。)
echo isset($arr['foo']); echo array_key_exists('foo', $arr) && !is_null($arr['foo']);
这两者都完全相同。如果值存在且值不是isset
,则true
会返回null
。如果数组键存在且其值不是true
,则第二行返回null
。同样的事情。
我的经历很糟糕......
你需要更详细一些,因为在你描述的时候isset
应该没有任何警告。
请参阅The Definitive Guide To PHP's isset And empty和Difference between isset and array_key_exists。