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 相关文章推荐
FirePHP 推荐一款PHP调试工具
Apr 23 PHP
Php中用PDO查询Mysql来避免SQL注入风险的方法
Apr 25 PHP
Window 7/XP 安装Apache 2.4与PHP 5.4 的过程详解
Jun 02 PHP
PHP删除数组中特定元素的两种方法
Jul 02 PHP
php过滤所有恶意字符(批量过滤post,get敏感数据)
Mar 18 PHP
php实现zip压缩文件解压缩代码分享(简单易懂)
May 10 PHP
PHP中feof()函数实例测试
Aug 23 PHP
PHP实现递归复制整个文件夹的类实例
Aug 03 PHP
ThinkPHP中html:list标签用法分析
Jan 09 PHP
php中通用的excel导出方法实例
Dec 30 PHP
Laravel开启跨域请求的方法
Oct 13 PHP
详解PHP用mb_string处理windows中文字符
May 26 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语法(1)
2006/10/09 PHP
php include类文件超时问题处理
2015/02/06 PHP
php读取txt文件并将数据插入到数据库
2016/02/23 PHP
提高Laravel应用性能方法详解
2019/06/24 PHP
用JavaScript实现仿Windows关机效果
2007/03/10 Javascript
Dojo 学习要点
2010/09/03 Javascript
jQuery获取注册信息并提示实现代码
2013/04/21 Javascript
验证码在IE中不刷新而谷歌等浏览器正常的解决方案
2014/03/18 Javascript
初识Node.js
2015/03/20 Javascript
JavaScript模拟数组合并concat
2016/03/06 Javascript
Bootstrap+jfinal退出系统弹出确认框的实现方法
2016/05/30 Javascript
IE下JS保存图片的简单实例
2016/07/15 Javascript
slideToggle+slideup实现手机端折叠菜单效果
2017/05/25 Javascript
使用mock.js随机数据和使用express输出json接口的实现方法
2018/01/07 Javascript
关于vue中 $emit的用法详解
2018/04/12 Javascript
JavaScript中filter的用法实例分析
2019/02/27 Javascript
Vue项目中配置pug解析支持
2019/05/10 Javascript
一篇文章弄懂javascript中的执行栈与执行上下文
2019/08/09 Javascript
vue 项目打包时样式及背景图片路径找不到的解决方式
2019/11/12 Javascript
vue实现虚拟列表功能的代码
2020/07/28 Javascript
Javascript如何实现扩充基本类型
2020/08/26 Javascript
Element-ui el-tree新增和删除节点后如何刷新tree的实例
2020/08/31 Javascript
Python3 伪装浏览器的方法示例
2017/11/23 Python
Python用户推荐系统曼哈顿算法实现完整代码
2017/12/01 Python
浅谈Python批处理文件夹中的txt文件
2019/03/11 Python
详解Python学习之安装pandas
2019/04/16 Python
Django的性能优化实现解析
2019/07/30 Python
Python pandas实现excel工作表合并功能详解
2019/08/29 Python
Python 实现敏感目录扫描的示例代码
2020/05/21 Python
iKRIX意大利网上商店:男女豪华服装和配件
2019/10/09 全球购物
党员创先争优公开承诺书
2014/03/28 职场文书
2014年扶贫帮困工作总结
2014/12/09 职场文书
工会文体活动总结
2015/05/07 职场文书
新娘婚礼致辞
2015/07/27 职场文书
志愿者工作心得体会
2016/01/15 职场文书
《圆的周长》教学反思
2016/02/17 职场文书