可能是重复问题:
比较两个变量返回false结果
<?php
if( "32 is this a bug of php " == 32)
echo "true";
else
echo "false";
?>
输出结果为:
true
你可以在http://codepad.org/hgOisqZ8上查看其输出。
为什么这个条件被判断为真?
可能是重复问题:
比较两个变量返回false结果
<?php
if( "32 is this a bug of php " == 32)
echo "true";
else
echo "false";
?>
输出结果为:
true
由于PHP在类型转换方面相当愚笨。
该表达式首先将“32 is this a bug of php”强制转换为整数,结果为32。然后比较结果为true。
如果您想进行类型安全比较,请使用===运算符。
<?php
if( "32 is this a bug of php " === 32)
echo "true";
else
echo "false";
?>
输出结果将为false。
请注意,使用 === 运算符时,我们得到了 "32" !== 32
的结果,因为一个变量是字符串类型,而另一个变量是整数类型。
这在PHP手册中有所讨论。
字符串转换为数字
当一个字符串在数值上下文中被计算时,其结果的数值和类型将根据以下规则确定。
如果字符串包含字符'.'、'e'或'E',则其将被计算为浮点数。否则,它将被计算为整数。
该值由字符串的初始部分给出。如果字符串以有效的数字数据开头,则将使用此值,否则该值将为0(零)。有效的数字数据是可选的符号,后跟一个或多个数字(可选地包含小数点),后跟一个可选指数。指数是'e'或'E'后跟一个或多个数字。
请注意其中的一部分:
如果字符串以有效的数字数据开头,则将使用此值。
由于您的字符串以32
开头,因此PHP将比较 if(32 == 32)
,这将返回true。
在处理可能具有不同类型的类型时,如不希望发生这种行为,请使用类型安全检查,考虑到数据类型。
1 === 1: true
1 == 1: true
1 === "1": false
1 == "1": true
"foo" === "foo": true
需要注意的是,在php中,$a==$b && $b==$c
并不意味着$a == $c
。
示例:
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";
?>