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 相关文章推荐
使用MaxMind 根据IP地址对访问者定位
Oct 09 PHP
文件系统基本操作类
Nov 23 PHP
PHP中文分词的简单实现代码分享
Jul 17 PHP
Android ProgressBar进度条和ProgressDialog进度框的展示DEMO
Jun 19 PHP
PHP和JavaScrip分别获取关联数组的键值示例代码
Sep 16 PHP
php防止sql注入示例分析和几种常见攻击正则表达式
Jan 12 PHP
PHP判断一个gif图片是否为动态图片的方法
Nov 19 PHP
PHP加密解密类实例分析
Apr 20 PHP
yii2实现根据时间搜索的方法
May 25 PHP
PHP中常见的密码处理方式和建议总结
Oct 14 PHP
Laravel 不同生产环境服务器的判断实践
Oct 15 PHP
Nginx+php配置文件及原理解析
Dec 09 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执行多个存储过程的方法【基于thinkPHP】
2016/11/08 PHP
PHP判断一个变量是否为整数、正整数的方法示例
2019/09/11 PHP
javascript下arguments,caller,callee,call,apply示例及理解
2009/12/24 Javascript
JS.getTextContent(element,preformatted)使用介绍
2013/09/21 Javascript
js实现的类似于asp数据字典的数据类型代码实例
2014/09/03 Javascript
JavaScript插件化开发教程 (三)
2015/01/27 Javascript
JavaScript限定图片显示大小的方法
2015/03/11 Javascript
Angularjs中如何使用filterFilter函数过滤
2016/02/06 Javascript
前端编码规范(3)JavaScript 开发规范
2017/01/21 Javascript
JavaScript标准对象_动力节点Java学院整理
2017/06/27 Javascript
使用JavaScript开发跨平台的桌面应用详解
2017/07/27 Javascript
分享vue里swiper的一些坑
2018/08/30 Javascript
JavaScript Date对象功能与用法学习记录
2020/04/28 Javascript
[59:36]2018DOTA2亚洲邀请赛 4.3 突围赛 Secret vs VG 第二场
2018/04/04 DOTA
Python单链表的简单实现方法
2014/09/23 Python
Python使用scrapy抓取网站sitemap信息的方法
2015/04/08 Python
Python多线程下载文件的方法
2015/07/10 Python
selenium+python 去除启动的黑色cmd窗口方法
2018/05/22 Python
Python装饰器的执行过程实例分析
2018/06/04 Python
python调用百度语音识别api
2018/08/30 Python
解决pandas .to_excel不覆盖已有sheet的问题
2018/12/10 Python
Python字符串中添加、插入特定字符的方法
2019/09/10 Python
python绘制随机网络图形示例
2019/11/21 Python
python模块如何查看
2020/06/16 Python
css3 条纹化和透明化表格Firefox下测试成功
2014/04/15 HTML / CSS
详解Html5原生拖拽操作
2018/01/12 HTML / CSS
造价工程师个人求职信
2013/09/21 职场文书
酒店办公室文员岗位职责
2013/12/18 职场文书
CAD制图人员的自荐信
2014/02/07 职场文书
党员大会主持词
2014/04/02 职场文书
荷叶母亲教学反思
2014/04/30 职场文书
2014年新生军训方案
2014/05/01 职场文书
一劳永逸彻底解决pip install慢的办法
2021/05/24 Python
MySQL 外连接语法之 OUTER JOIN
2022/04/09 MySQL
MySQL去除密码登录告警的方法
2022/04/20 MySQL
Android开发之底部导航栏的快速实现
2022/04/28 Java/Android