用PHP

时间:2018-05-25 08:13:09

标签: php isset isnull array-key-exists

了解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 的更好替代方案是什么?

1 个答案:

答案 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 emptyDifference between isset and array_key_exists