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 相关文章推荐
其他功能
Oct 09 PHP
php 静态变量的初始化
Nov 15 PHP
php显示指定目录下子目录的方法
Mar 20 PHP
ThinkPHP安装和设置
Jul 27 PHP
在WordPress中使用PHP脚本来判断访客来自什么国家
Dec 10 PHP
编写PHP脚本使WordPress的主题支持Widget侧边栏
Dec 14 PHP
浅析Yii2 gridview实现批量删除教程
Apr 22 PHP
详解Laravel视图间共享数据与视图Composer
Aug 04 PHP
php组合排序简单实现方法
Oct 15 PHP
PHP迭代器和生成器用法实例分析
Sep 28 PHP
Laravel解决nesting level错误和隐藏index.php的问题
Oct 12 PHP
PHP实用小技巧之调用录像的方法
Dec 05 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&amp;&amp;mysql)二
2006/10/09 PHP
解析:通过php socket并借助telnet实现简单的聊天程序
2013/06/18 PHP
php操作xml
2013/10/27 PHP
php提示Warning:mysql_fetch_array() expects的解决方法
2014/12/16 PHP
php实现的读取CSV文件函数示例
2017/02/07 PHP
利用Homestead快速运行一个Laravel项目的方法详解
2017/11/14 PHP
php微信公众号开发之微信企业付款给个人
2018/10/04 PHP
jquery插件制作教程 txtHover
2012/08/17 Javascript
JavaScript中的类数组对象介绍
2014/12/30 Javascript
浅析AngularJS Filter用法
2015/12/28 Javascript
基于jQuery Ajax实现上传文件
2016/03/24 Javascript
使用JQuery中的trim()方法去掉前后空格
2016/09/16 Javascript
vue实现某元素吸顶或固定位置显示(监听滚动事件)
2017/12/13 Javascript
微信小程序自定义弹窗滚动与页面滚动冲突的解决方法
2019/07/16 Javascript
Node.js在图片模板上生成二维码图片并附带底部文字说明实现详解
2019/08/07 Javascript
javascript Canvas动态粒子连线
2020/01/01 Javascript
详解Node.js使用token进行认证的简单示例
2020/05/25 Javascript
Python配置文件解析模块ConfigParser使用实例
2015/04/13 Python
Python中decorator使用实例
2015/04/14 Python
Python时间获取及转换知识汇总
2017/01/11 Python
解决Tensorflow使用pip安装后没有model目录的问题
2018/06/13 Python
10分钟教你用Python实现微信自动回复功能
2018/11/28 Python
使用python客户端访问impala的操作方式
2020/03/28 Python
python实现斗地主分牌洗牌
2020/06/22 Python
Python使用shutil模块实现文件拷贝
2020/07/31 Python
解决pycharm导入numpy包的和使用时报错:RuntimeError: The current Numpy installation (‘D:\\python3.6\\lib\\site-packa的问题
2020/12/08 Python
利用CSS3的flexbox实现水平垂直居中与三列等高布局
2016/09/12 HTML / CSS
在C语言中实现抽象数据类型什么方法最好
2014/06/26 面试题
法学函授自我鉴定
2014/02/06 职场文书
yy生日主持词
2014/03/20 职场文书
会计求职自荐信
2014/06/20 职场文书
2014年检察院个人工作总结
2014/12/09 职场文书
先进学校事迹材料
2014/12/30 职场文书
2015年行政执法工作总结
2015/05/23 职场文书
刑事法律意见书
2015/06/04 职场文书
老舍《猫》教学反思
2016/02/17 职场文书