PHP 未知类型变量 empty isset 陷阱

用 empty 检查位置类型的变量时,容易掉进难以察觉的陷阱,请看下面简单的代码,预测一下 3 个 var_dump 的输出:

$mixed_1    = array();
$mixed_2    = 'Nihao';

$bool_1        = empty($mixed_1['1_type']);
$bool_2        = empty($mixed_2['2_type']);

var_dump($bool_1);
var_dump($bool_2);

var_dump($mixed_2['2_type']);

为了不影响你的判断,我多空几行,然后对比结果,是否跟你判断的一致。

公布结果:

bool(true)
bool(false)
string(1) "h"

后面 2 个结果,是不是有点意外?

导致问题的原因,就是 PHP 会自动把字符串按照数组来处理,并且,当 $mixed 不是严格意义的数组时,对元素的引用 key 会把 key 转换为数字,2_type 转换为数字之后,就是数字 “2”,对应的元素值就是 “h”。

对应的,isset 也会认为 $mixed_2[‘2_type’] 是存在的。

结论:

在对未知类型的变量做 isset 或 empty 查询时,应同时附加 is_array 等类型检查,才会更安全。

Tags: , ,

3 comments

Leave a Reply

Your email address will not be published.

*