可能重复:
比较两个变量返回错误结果
<?php
if( "32 is this a bug of php " == 32)
echo "true";
else
echo "false";
?>
输出是:
true
你可以在http://codepad.org/hgOisqZ8看到它的输出
为什么这个条件被评估为真?
可能重复:
比较两个变量返回错误结果
<?php
if( "32 is this a bug of php " == 32)
echo "true";
else
echo "false";
?>
输出是:
true
你可以在http://codepad.org/hgOisqZ8看到它的输出
为什么这个条件被评估为真?
因为 PHP 在类型转换方面非常愚蠢。
通过首先将“32 is this a bug of php”转换为整数来评估此表达式,结果为 32。然后比较结果为真。
如果要进行类型安全比较,请使用 === 运算符
<?php
if( "32 is this a bug of php " === 32)
echo "true";
else
echo "false";
?>
输出将是错误的。
请注意,使用 === 运算符,我们得到了"32" !== 32
因为一个变量是string
当另一个变量是int
这在PHP 手册中进行了讨论。
字符串转换为数字
在数字上下文中评估字符串时,结果值和类型确定如下。
如果字符串包含任何字符“.”、“e”或“E”,则该字符串将被评估为浮点数。否则,它将被评估为整数。
该值由字符串的初始部分给出。如果字符串以有效的数字数据开头,这将是使用的值。否则,该值将为 0(零)。有效的数字数据是一个可选的符号,后跟一个或多个数字(可选地包含一个小数点),后跟一个可选的指数。指数是“e”或“E”后跟一位或多位数字。
注意声明的部分
如果字符串以有效的数字数据开头,这将是使用的值。
由于您的字符串以32
PHP 开头,因此会比较if(32 == 32)
哪个为真。
使用类型安全检查,将数据类型考虑在内,如果不希望出现这种行为,则在处理可能不同的类型时。像
1 === 1: true
1 == 1: true
1 === "1": false
1 == "1": true
"foo" === "foo": true
请参阅比较运算符的文档:
如果将数字与字符串进行比较或比较涉及数字字符串,则每个字符串都将转换为数字并以数字方式执行比较。
所以不,这不是错误,而是语言的设计方式。
===
如果您不想打字杂耍,请使用。
请注意,您还需要知道$a==$b && $b==$c
这并不意味着 $a == $c
在 php.ini 中。
例子:
var_dump('32E0' == '32');
var_dump('32' == 32);
var_dump(32 == '32 is a bug');
var_dump('32E0' == '32 is a bug');
输出是:
bool(true)
bool(true)
bool(true)
bool(false)
你也可以这样使用
<?php
if( "32 is this a bug of php " == '32')
echo "true";
else
echo "false";
?>