用 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 等类型检查,才会更安全。
所以要多看手册呀 /偷笑
我也发过一篇类似的blog.
php的弱类型脚本语言特性,导致很多不易发现的陷阱,我的博客也专门收集了一些。