彻底解决php判断a==0为真引发的问题-类型转换
Posted 曙光城邦
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了彻底解决php判断a==0为真引发的问题-类型转换相关的知识,希望对你有一定的参考价值。
一、起因
经常会遇到 字符串==0 进行逻辑判断时,判断结果尽然为真。
例如下面的代码尽然输出了“字符串a尽然等于0”,刚开始会让人大跌眼镜。但知道了原因之后其实很简单。这一切都是因为php是弱类型语言,当不同类型的值进行==比较的时候会发生类型转换。
<?php if(\'a\'==0){ echo "字符串a尽然等于0"; }
二、原因
php虽然是弱类型的语言,但它是有数据类型的。大概分为三种类型:字符串、数字、布尔型。上面的问题出现是由于字符串转换为了数字类型。
正常情况下不同类型的值是不能比较的,php 为了比较进行了数据类型转换。把不同类型的值转换为相同类型后再比较。
规则如下:
宽松比较(==)类型转换规则
(1)数字和字符串比较,将字符串转为数字,然后进行比较
(2)数字和布尔型比较,将数字转为布尔型,然后进行比较
(3)字符串和布尔型比较,将字符串转为布尔型,然后进行比较。
宽松比较的落脚点只有两个,一个是布尔型,一个是数字。只有当数字和字符串比较的时候,会把字符串转为数字
三、字符串转数字
1. 字符串的开始部分决定了它的数字值。
2. 如果该字符串以合法的数字值开始,则使用该数值。否则其值为 0(零)。
3. 合法数字值可以是正负号,后面跟着一个或多个数字(可能有小数点),再跟着可选的指数部分。指数部分由 \'e\' 或 \'E\' 后面跟着一个或多个数字构成。
四、剖析 \'a\'==0
\'a\' 这是一个字符串类型。0 是数字类型。使用 == 宽松比较,此时发生类型转换。字符串和数字比较,是将字符串转换为数字然后进行比较的。
运算步骤一:根据字符串转数字的规则,字符串的开始部分决定了它的数字值。该字符串的开头不是数字,则它的数字值为0。
所以\'a\' 转换为数字类型时,它其实为0了。不仅\'a\'等于0,\'abc\',\'aabbcc\' 它们转为数字也是0哦。
运算步骤二:最后比较0是否等于0,结果为真。
五、更多示例
<?php //不带数字的字符串 $a=\'a\'; $b=\'b\'; $c="cc"; var_dump((int)$a); //输出int(0) var_dump((int)$b); //输出int(0) var_dump((int)$c); //输出int(0) //字符串开头是数字 $a=\'1a\'; $b=\'2b\'; $c="100cc"; var_dump((int)$a); //输出int(1) var_dump((int)$b); //输出int(2) var_dump((int)$c); //输出int(100) //字符串结尾是数字 $a=\'a1\'; $b=\'b2\'; $c="cc100"; var_dump((int)$a); //输出 int(0) var_dump((int)$b); //输出 int(0) var_dump((int)$c); //输出 int(0) //字符串中间是数字 $a=\'a1a\'; $b=\'b2b\'; $c="cc100cc"; var_dump((int)$a); //输出 int(0) var_dump((int)$b); //输出 int(0) var_dump((int)$c); //输出 int(0) //字符串开头是浮点数 $a=\'1.1a\'; $b=\'2.2b\'; $c="100.1cc"; var_dump((float)$a); //输出 double(1.1) var_dump((float)$b); //输出 double(2.2) var_dump((float)$c); //输出 double(100.1) //字符串开头是小数点 $a=\'.1a\'; $b=\'.2b\'; $c=".1cc"; var_dump((float)$a); //输出 double(0.1) var_dump((float)$b); //输出 double(0.2) var_dump((float)$c); //输出 double(0.1) //字符串开头是科学计数法的浮点数 $a=\'1e1a\'; $b=\'2E2b\'; $c="3e3cc"; var_dump((float)$a); //输出 double(10) var_dump((float)$b); //输出 double(200) var_dump((float)$c); //输出 double(3000) //字符串以0开头,以十进制解析 $a=\'0a\'; $b=\'01b\'; $c="02cc"; var_dump((float)$a); //输出 double(0) var_dump((float)$b); //输出 double(1) var_dump((float)$c); //输出 double(2)
运算:
$foo = 1 + "10.5"; // $foo is float (11.5) $foo = 1 + "-1.3e3"; // $foo is float (-1299) $foo = 1 + "bob-1.3e3"; // $foo is integer (1) $foo = 1 + "bob3"; // $foo is integer (1) $foo = 1 + "10 Small Pigs"; // $foo is integer (11) $foo = 4 + "10.2 Little Piggies"; // $foo is float (14.2) $foo = "10.0 pigs " + 1; // $foo is float (11) $foo = "10.0 pigs " + 1.0; // $foo is float (11)
判别流程:1,看开头是否有合法的数值,有则使用,无则为0。 2,合法的数值不含. e E在整形范围为整数,其他为浮点。
以上是关于彻底解决php判断a==0为真引发的问题-类型转换的主要内容,如果未能解决你的问题,请参考以下文章