![](/img/trans.png)
[英]php array_key_exists, !empty and isset fails for no reason?
[英]Replacing array_key_exists() with isset() in PHP
了解PHP中array_key_exists()
和isset()
的区别,我在网络上看到很多拥护者建议用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']);
代码片段2始终可以使用,但看起来笨拙且难以阅读。 至于代码片段1 ,我的经历很糟糕……我以前在开发机器上写过类似的东西。 它运行得很好,但是当我将代码部署到生产机器上时,它仅仅因为数组中不存在键而引发了错误。 经过一些调试后,我发现开发机器和生产机器之间的PHP配置不同,它们的PHP版本也略有不同。
所以,我在想用isset()
替换array_key_exists()
真的安全吗? 如果不是,那么代码片段2的更好替代方案是什么?
在一个项目中,我具有用户提交的$ var值。
这是如何运作的? 用户不应设置变量 。 他们应该能够例如提交以$_POST
结尾的表单值。 我再说一遍,它们应该不能直接在您的范围内创建变量 。
如果“用户”是指人们在其中编写并include
PHP代码的某种插件系统,那么您可能需要考虑定义一个比设置变量更稳定的接口。
该值可以是任何值,甚至可以为NULL…
如果这是通过HTTP提交的值,则不会。 HTTP没有null
概念。 它要么是一个空字符串,要么根本不存在。
单独使用
!empty($var)
是危险的,因为如果未预先定义$var
,PHP将抛出错误
那是错的。 专门存在empty
来测试变量是否为假,而不抛出错误。 empty($var)
与!$var
相同,但是如果变量不存在则不会触发错误。
所以我有
isset($var) && !empty($var)
来检查$var
是否持有非空值。
请参阅为什么同时检查isset()和!empty() 。 (剧透:这是多余的。)
echo isset($arr['foo']); echo array_key_exists('foo', $arr) && !is_null($arr['foo']);
这些都做完全相同的事情。 如果值存在并且其值不为null
则isset
返回true
。 如果数组键存在并且其值不为null
则第二行返回true
。 一样。
我的经历很糟糕...
你需要大约是更详细的,因为不应该有一点需要注意isset
你描述它。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.