PHP字符串 ==比较运算符的副作用


复制代码 代码如下:

$a = '212345678912000005';
$b = '212345678912000001';
var_dump($a == $b);

这段代码的输出是bool(true), 说明这样判断会得出结论是两者相等. 类似的特性在in_array()函数第3个参数为false或者不设置的情况. 原因是首先判断字符串是否是数字, 然后转换成long或者double(C语言数据类型)再判断 - 使用zendi_smart_strcmp. 但是, 源码中的注释说声明考虑了溢出的情况,
复制代码 代码如下:

} else if (dval1 == dval2 && !zend_finite(dval1)) {
/* Both values overflowed and have the same sign,
* so a numeric comparison would be inaccurate */
goto string_cmp;
}

dval1和dval2分别是两个字符串转换为double型后的值. 但为什么还是这样呢? 也许这个判断并不正确. 进一步研究再说...

解决方法, 使用三个等号"==="代替两个等号"==", in_array()函数设置第三个参数为true: in_array('val', $array, true).



相关阅读:
Z-Blog 留言评论显示IP地址和性能优化
CSS教程 汇总让IE6崩溃的几种方法
sql存储过程获取汉字拼音头字母函数
W3C教程(4):W3C XHTML 活动
isArray()函数(JavaScript中对象类型判断的几种方法)
winXP不能够正常关机的解决方法
改写MySQL翻页例子
asp一句话木马原理分析
DOS未公开的命令与参数
ASP.NET性能优化之局部缓存分析
配置X11
CSS 在IE6, IE7 和IE8中的差别
模拟select的代码
再谈浏览器滚动条“变脸”大法
快速导航

Copyright © 2016 phpStudy | 皖ICP备18014864号-4