php中关于==和===的理解和认识
来源:互联网 发布:运营数据分析 数据挖掘 编辑:程序博客网 时间:2024/06/05 23:52
问题抛出:
var_dump("1" == "1e0"); //true var_dump("1" == "1ef"); //false 这两个的结果为什么不一样啊.
这确实是一个很郁闷的问题,为什么呢?
问题的分析:
当然一点点看源码。看相关的引用到函数。
简单粗暴解决问题:
1,==时候php最终会用到C的strcmp函数
查看compare_function
在compare_function中, 当俩个比较操作数都是string的时候,会调用zendi_smart_strcmp(具体就不贴代码了)。
在compare_function中, 当俩个比较操作数都是string的时候,会调用zendi_smart_strcmp(具体就不贴代码了)。
但是如果是strcmp的话,那么答案的结果应该是这样的:
var_dump("1" == "1e0"); //false var_dump("1" == "1ef"); //false 这两个的结果为什么不一样啊.
起码他们一样了!!!哈哈。但是php中确实都是一个true一个false。妈蛋!!!
2,难道==前,==两边发了什么
沃日,不会吧!当一切可能都不可能的话,那么不可能就变成了可能。
还是在zendi_smart_strcmp中,看来不把他贴出来难平猿愤了!源码如下:
ZEND_API void zendi_smart_strcmp(zval *result, zval *s1, zval *s2) /* {{{ */{ int ret1, ret2; long lval1, lval2; double dval1, dval2; if ((ret1=is_numeric_string(Z_STRVAL_P(s1), Z_STRLEN_P(s1), &lval1, &dval1, 0)) && (ret2=is_numeric_string(Z_STRVAL_P(s2), Z_STRLEN_P(s2), &lval2, &dval2, 0))) { if ((ret1==IS_DOUBLE) || (ret2==IS_DOUBLE)) { if (ret1!=IS_DOUBLE) { dval1 = (double) lval1; } else if (ret2!=IS_DOUBLE) { dval2 = (double) lval2; } 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; } Z_DVAL_P(result) = dval1 - dval2; ZVAL_LONG(result, ZEND_NORMALIZE_BOOL(Z_DVAL_P(result))); } else { /* they both have to be long's */ ZVAL_LONG(result, lval1 > lval2 ? 1 : (lval1 < lval2 ? -1 : 0)); } } else {string_cmp: Z_LVAL_P(result) = zend_binary_zval_strcmp(s1, s2); ZVAL_LONG(result, ZEND_NORMALIZE_BOOL(Z_LVAL_P(result))); }}
果然, 对于俩个字符串, 会首先判断他们是否是numeric_string, 如果是,那么就会转换成整形来比较.关于转换就要细看C的strtol函数了!那么什么是numeric string呢? 因为PHP不区分类型, 所以她采用一个策略, 当你的变量看起来是一个数字的时候, 那么她就认为这个变量是一个数字. 简单来说, numeric_string就是表示数字的字符串.太坑了吧!所以大家还是用=== 吧!!!
3,再看问题
var_dump("1" == "1e0"):1,numeric_string策略通过;2,strcmp("1",strtol("1e0"))。
var_dump("1" == "1ef"):1,numeric_string策略不通过;2,strcmp("1","1ef")。
所以还是多用===!!!!
0 0
- php中关于==和===的理解和认识
- 关于equals 和 == 的理解
- 关于CRM的理解和认识
- 关于泛型的认识和理解
- 关于分布式的一些理解和认识
- 关于equals()和==操作的一点理解
- 关于equals方法和“==”的个人理解
- 关于 php 中 pack 、unpack、 ord 的理解和用法
- 关于 php 中 pack 、unpack、 ord 的理解和用法
- php中->和=>的区别
- PHP中 ->和=>的区别是什么
- PHP中->和=>的意思
- 关于正则表达式中的(?=re)的理解和例子
- php中“=>”和 “->” 区别
- 关于编码的一些认识和理解(Kemin原创)
- 关于php中携带的php-fpm和php-cgi的理解纠正
- 总结一下java中我认识的哈希码以及equals和==的区别
- HDFS的认识和理解
- dispatch_group项目中使用
- oracle默认初始化用户名密码和密码修改
- STM32 串口中的硬件BUG,请注意!
- 9月的天气很好,bug很少
- 半小时学会上传本地项目到github 及 github提交报错failed to add file / to index解决办法
- php中关于==和===的理解和认识
- Android Path的使用详解
- Maven类包冲突终极三大解决技巧 mvn dependency:tree
- mysql函数group_concat,find_in_set
- RedHat 换 yum 源
- Plugin is too old, please update to a more recent version
- android 开发 性能优化
- java Nunber数据类型比较
- AnimatorDurationTile