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 和 MySQL 开发的 8 个技巧
Jan 02 PHP
mysql4.1以上版本连接时出现Client does not support authentication protocol问题解决办法
Mar 15 PHP
php下使用SMTP发邮件的代码
Jan 10 PHP
javascript,php获取函数参数对象的代码
Feb 03 PHP
PHP 安全检测代码片段(分享)
Jul 05 PHP
php判断文件上传类型及过滤不安全数据的方法
Dec 17 PHP
PHP微信开发之模板消息回复
Jun 24 PHP
实例讲解YII2中多表关联的使用方法
Jul 21 PHP
PHP array_reduce()函数的应用解析
Oct 28 PHP
laravel实现上传图片的两种方式小结
Oct 12 PHP
gearman中任务的优先级和返回状态实例分析
Feb 27 PHP
PHP const定义常量及global定义全局常量实例解析
May 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
php统计时间和内存使用情况示例分享
2014/03/13 PHP
PHP中使用hidef扩展代替define提高性能
2015/04/09 PHP
laravel 5异常错误:FatalErrorException in Handler.php line 38的解决
2017/10/12 PHP
javascript 年月日联动实现核心代码
2009/12/21 Javascript
两种方法实现在HTML页面加载完毕后运行某个js
2014/06/16 Javascript
在Ubuntu上安装最新版本的Node.js
2014/07/14 Javascript
JS实现的数组全排列输出算法
2015/03/19 Javascript
在JavaScript中用getMinutes()方法返回指定的分时刻
2015/06/10 Javascript
jquery获得当前html页面源码的方法
2015/07/14 Javascript
jquery插件jquery.beforeafter.js实现左右拖拽分隔条对比图片的方法
2015/08/07 Javascript
浅析Bootstrap缩略图组件与警示框组件
2016/04/29 Javascript
深入理解javascript作用域第二篇之词法作用域和动态作用域
2016/07/24 Javascript
深入理解JavaScript中的并行处理
2016/09/22 Javascript
jQuery删除当前节点元素
2016/12/07 Javascript
详解如何在你的Vue项目配置vux
2018/06/04 Javascript
bootstrap select2插件用ajax来获取和显示数据的实例
2018/08/09 Javascript
vue.js 双层嵌套for遍历的方法详解, 类似php foreach()
2018/09/07 Javascript
JSON stringify方法原理及实例解析
2020/10/23 Javascript
[17:00]DOTA2 HEROS教学视频教你分分钟做大人-帕克
2014/06/10 DOTA
[07:39]第一届亚洲邀请赛回顾视频
2017/02/14 DOTA
python使用mysql数据库示例代码
2017/05/21 Python
Python基于OpenCV实现视频的人脸检测
2018/01/23 Python
python自动分箱,计算woe,iv的实例代码
2019/11/22 Python
python 使用opencv 把视频分割成图片示例
2019/12/12 Python
python 使用raw socket进行TCP SYN扫描实例
2020/05/05 Python
python的pip有什么用
2020/06/17 Python
利用CSS3动画实现圆圈由小变大向外扩散的效果实例
2018/09/10 HTML / CSS
CSS3 @media的基本用法总结
2019/09/10 HTML / CSS
万得城电器土耳其网站:欧洲第一大电子产品零售商
2016/10/07 全球购物
法国最大电子商务平台:Cdiscount
2018/03/13 全球购物
英国汽车零件购物网站:GSF Car Parts
2019/05/23 全球购物
英语商务邀请函范文
2014/01/16 职场文书
2016年度员工工作表现评语
2015/12/02 职场文书
企业管理制度设计时要注意的几种“常见病”!
2019/04/19 职场文书
vue引入Excel表格插件的方法
2021/04/28 Vue.js
一篇文章带你了解Python和Java的正则表达式对比
2021/09/15 Python