PHP容易被忽略而出错陷阱 数字与字符串比较


Posted in PHP onNovember 10, 2011

0 与任意非数字(或者说,不可转化为数字的字符)前导的字符串比较(操作符为==), 均返回 true.

原因是, 数字与字符串比较时, 先尝试将字符串转换为数字, 再比较, 一个不能转换为数字的字符串, 转换结果为0, 故, 与0比较总返回 true.

更加详细的比较规则, 多种类型的比较规则, 在 PHP手册/语言参考/运算符/比较运算符 可以找到.

在PHP里当两个数字型字符串(只含数字的字符串)进行比较的时候是直接转换成数值进行比较的
如下示例:(注意$a和$b两个变量的最后一位不相等)

//示例1 
<?php 
$a = '511203199106034578'; 
$b = '511203199106034579'; 
if ($a==$b) { 
echo 'equal'; 
} else { 
echo 'notEqual'; 
} 
?>

运行上面的程序却发现结果为equal(非我们认为的结果)

我们把$a与$b分别加一个字母a进去

//示例2 
<?php 
$a = 'a511203199106034578'; 
$b = 'a511203199106034579'; 
if ($a==$b) { 
echo 'equal'; 
} else { 
echo 'notEqual'; 
} 
?>

这次输出的是notEqual(正确的结果)

示例1为equal是因为PHP把两个数字型字符串转换成数字型,而这两个数字刚好相等如下示例

<?php 
$a = 511203199106034578; 
$b = 511203199106034579; 
echo $a; // 输出 5.1120319910603E+17 即511203199106030000 
echo $b; // 输出 5.1120319910603E+17 即511203199106030000 
?>

所以我们在示例1中得到的结果是equal

避免出现这种非预期结果的情况是使用类型比较符===如下示例(如果 $a 等于 $b,并且它们的类型也相同)

//示例4 
<?php 
$a = '511203199106034578'; 
$b = '511203199106034579'; 
if ($a===$b) { 
echo 'equal'; 
} else { 
echo 'notEqual'; 
} 
?>

这样我们就可以得到预期中的notEqual了
PHP 相关文章推荐
PHP的FTP学习(三)
Oct 09 PHP
解析PHP将对象转换成数组的方法(兼容多维数组类型)
Jun 21 PHP
PHP 伪静态技术原理以及突破原理实现介绍
Jul 12 PHP
php过滤XSS攻击的函数
Nov 12 PHP
PHP中使用GD库创建圆形饼图的例子
Nov 19 PHP
Yii入门教程之目录结构、入口文件及路由设置
Nov 25 PHP
PHP引用的调用方法分析
Apr 25 PHP
PHP面试常用算法(推荐)
Jul 22 PHP
Fleaphp常见函数功能与用法示例
Nov 15 PHP
php7安装yar扩展的方法详解
Aug 03 PHP
深入理解PHP的远程多会话调试
Sep 21 PHP
PHP迭代器和生成器用法实例分析
Sep 28 PHP
PHP及Zend Engine的线程安全模型分析
Nov 10 #PHP
PHP 多维数组的排序问题 根据二维数组中某个项排序
Nov 09 #PHP
php fsockopen中多线程问题的解决办法[翻译]
Nov 09 #PHP
PHP句法规则详解 入门学习
Nov 09 #PHP
php空间不支持socket但支持curl时recaptcha的用法
Nov 07 #PHP
PHP动态分页函数,PHP开发分页必备啦
Nov 07 #PHP
php获取远程图片的两种 CURL方式和sockets方式获取远程图片
Nov 07 #PHP
You might like
mac下Apache + MySql + PHP搭建网站开发环境
2014/06/02 PHP
PHP串行化与反串行化实例分析
2016/12/27 PHP
thinkPHP+phpexcel实现excel报表输出功能示例
2017/06/06 PHP
Ajax+PHP实现的删除数据功能示例
2019/02/12 PHP
关于文本限制字数的js代码
2007/04/02 Javascript
Jquery下判断Id是否存在的代码
2011/01/06 Javascript
可自定义速度的js图片无缝滚动示例分享
2014/01/20 Javascript
Bootstrap组件(一)之菜单
2016/05/11 Javascript
全面解析JavaScript里的循环方法之forEach,for-in,for-of
2020/04/20 Javascript
jquery获取点击控件的绝对位置简单实例
2016/10/13 Javascript
深究AngularJS中$sce的使用
2017/06/12 Javascript
JavaScript对象_动力节点Java学院整理
2017/06/23 Javascript
Vue封装Swiper实现图片轮播效果
2018/02/06 Javascript
如何利用node转发请求详解
2020/09/17 Javascript
[03:35]2018年度DOTA2最佳辅助位选手5号位-完美盛典
2018/12/17 DOTA
[02:42]岂曰无衣,与子同袍!DOTA2致敬每一位守护人
2020/02/17 DOTA
python类定义的讲解
2013/11/01 Python
在Python中使用Neo4j数据库的教程
2015/04/16 Python
Python实现MySQL操作的方法小结【安装,连接,增删改查等】
2017/07/12 Python
Python爬虫中urllib库的进阶学习
2018/01/05 Python
Python学习之Django的管理界面代码示例
2018/02/10 Python
Python在Matplotlib图中显示中文字体的操作方法
2019/07/29 Python
详解Django-channels 实现WebSocket实例
2019/08/22 Python
通俗易懂了解Python装饰器原理
2020/09/17 Python
python中uuid模块实例浅析
2020/12/29 Python
HTML5 Canvas中使用路径描画二阶、三阶贝塞尔曲线
2015/01/01 HTML / CSS
巴西购物网站:Onofre Agora
2020/06/08 全球购物
师范院校学生自荐信范文
2013/12/27 职场文书
争论的故事教学反思
2014/02/06 职场文书
西式婚礼主持词
2014/03/13 职场文书
幼儿教师师德演讲稿
2014/05/06 职场文书
2014感恩节演讲稿大全
2014/10/11 职场文书
2014年评职称工作总结
2014/11/20 职场文书
市级三好生竞选稿
2015/11/21 职场文书
拥有这5个特征人,“命”都不会太差
2019/08/16 职场文书
详解使用 CSS prefers-* 规范提升网站的可访问性与健壮性
2021/05/25 HTML / CSS