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 相关文章推荐
UCenter中的一个可逆加密函数authcode函数代码
Jul 20 PHP
PHP 登录记住密码实现思路
May 07 PHP
PHP实现克鲁斯卡尔算法实例解析
Aug 22 PHP
PHP实现的迷你漂流瓶
Jul 29 PHP
微信公众平台开发之配置与请求
Aug 26 PHP
php使用timthumb生成缩略图的方法
Jan 22 PHP
PHP异常处理定义与使用方法分析
Jul 25 PHP
PHP实现的各类hash算法长度及性能测试实例
Aug 27 PHP
如何通过View::first使用Laravel Blade的动态模板详解
Sep 21 PHP
laravel框架上传图片实现实时预览功能
Oct 14 PHP
再谈Yii Framework框架中的事件event原理与应用
Apr 07 PHP
PHP设计模式(四)原型模式Prototype实例详解【创建型】
May 02 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
php字符串截取中文截取2,单字节截取模式
2007/12/10 PHP
php将数据库中的电话号码读取出来并生成图片
2008/08/31 PHP
PHP中MVC模式的模板引擎开发经验分享
2011/03/23 PHP
php json_encode奇怪问题说明
2011/09/27 PHP
php中定时计划任务的实现原理
2013/01/08 PHP
用php代码限制国内IP访问我们网站
2015/09/26 PHP
php自定义分页类完整实例
2015/12/25 PHP
PHP目录操作实例总结
2016/09/27 PHP
js 通用订单代码
2013/12/23 Javascript
jquery中JSON的解析方式
2015/03/16 Javascript
用JavaScript实现PHP的urlencode与urldecode函数
2015/08/13 Javascript
JS实现touch 点击滑动轮播实例代码
2017/01/19 Javascript
BootStrap Table前台和后台分页对JSON格式的要求
2017/06/28 Javascript
RequireJS用法简单示例
2018/08/20 Javascript
angularjs中判断ng-repeat是否迭代完的实例
2018/09/12 Javascript
简化版的vue-router实现思路详解
2018/10/19 Javascript
vue.js仿hover效果的实现方法示例
2019/01/28 Javascript
jQuery单页面文字搜索插件jquery.fullsearch.js的使用方法
2020/02/04 jQuery
基于JavaScript获取url参数2种方法
2020/04/17 Javascript
JavaScript设计模式--桥梁模式引入操作实例分析
2020/05/23 Javascript
[01:42]辉夜杯战队访谈宣传片—FANTUAN
2015/12/25 DOTA
Python+Django在windows下的开发环境配置图解
2009/11/11 Python
python读取文本绘制动态速度曲线
2018/06/21 Python
Python中staticmethod和classmethod的作用与区别
2018/10/11 Python
Python实现CNN的多通道输入实例
2020/01/17 Python
PageFactory设计模式基于python实现
2020/04/14 Python
详解向scrapy中的spider传递参数的几种方法(2种)
2020/09/28 Python
python中numpy数组与list相互转换实例方法
2021/01/29 Python
日语翻译个人求职的自我评价
2013/10/14 职场文书
前台文员的岗位职责
2013/11/14 职场文书
社区中秋节活动方案
2014/01/29 职场文书
旺仔牛奶广告词
2014/03/20 职场文书
请假条范文大全
2014/04/10 职场文书
法制宣传标语集锦
2014/06/25 职场文书
毕业生登记表班级意见
2015/06/05 职场文书
k8s部署redis cluster集群的实现
2021/06/24 Redis