php比较运算符的bug
疑问
首选,给出一个php的示例代码,如果你完全明白为什么会出现如下结果,就不需要再在这篇博客浪费时间了,这里是让php初学者注意一下可能会犯的错误
<?php var_dump("abcdefg" == "0"); // bool(false) var_dump("abdsafd" == 0); // bool(true)
如果你不是太清楚上面的结果,那就跟着博客继续学习下去吧!
比较运算符
比较运算符,如同它们名称所暗示的,允许对两个值进行比较。
例子 | 名称 | 结果 |
$a == $b | 等于 | TRUE,如果$a等于$b |
$a === $b | 全等 | TRUE,如果$a等于$b,并且它们的类型也相同 |
$a != $b | 不等 | TRUE,如果$a不等于$b |
$a <> $b | 不等 | TRUE,如果$a不等于$b |
$a !== $b | 非全等 | TRUE,如果$a不等于$b,或者它们的类型不同 |
$a < $b | 小于 | TRUE,如果$a严格小于$b |
$a > $b | 大于 | TRUE,如果$a严格大于$b |
$a <= $b | 小于等于 | TRUE,如果$a小于或者等于$b |
$a >= $b | 大于等于 | TRUE,如果$a大于或者等于$b |
注意:
- 如果比较一个整数和字符串,则字符串会被转换为整数
- 如果比较两个数字字符串,则作为整数比较
讲到这里,就可以说一下上面那个php代码了,var_dump("abcdefg" == "0")为false,是因为这是两个字符串比较,对应于c的strcmp函数,因此应该为false。然而,var_dump("abdsafd" == 0)为true,则需要学习一下字符串转换为整数的规则了
字符串转换为整数
当一个字符串被用在了一个数字的环境中,结果和类型如下:
如果字符串没有包含‘.’、'e'或'E',并且数字值符合整数类型的限定(PHP_INT_MAX定义的),这个字符串可被认定是一个integer,在其它情况下被认定为一个float
字符串的开始部分给定了它的值,如果字符串以合法的数字开始,这个数字就可直接使用。否则,值就是0.合法数值由符号,后面跟着一个或多个数字(可能有个小数点),再跟着可选的指数符号如'e'或'E',后面跟着一个或多个数字。
示例代码:
<?php $foo = 1 + "10.5"; // $foo is float (11.5) $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) ?>
这里应该可以彻底解释var_dump("abcdefg" == 0)为true了,因为比较运算符首先将“abcdefg”强制转换为整数0,因为0==0为true了