<?php
if( "32 is this a bug of php " == 32)
echo "true";
else
echo "false";
?>
输出是:
true
你可以看到它的输出 http://codepad.org/hgOisqZ8
为什么这个条件被评估为真?
答案 0 :(得分:7)
因为在类型转换方面,PHP非常愚蠢。
这个表达式是通过首先将“32 is this a php of php”转换为整数来评估的,其结果为32.然后比较结果为true。
如果要进行类型安全比较,请使用=== operator
<?php
if( "32 is this a bug of php " === 32)
echo "true";
else
echo "false";
?>
输出将为假。
请注意,使用===运算符我们得到"32" !== 32
,因为当其他变量为string
时,一个变量为int
答案 1 :(得分:6)
这在PHP Manual。
中讨论字符串转换为数字
在数值上下文中计算字符串时,结果值 和类型确定如下。
如果字符串包含任何字符串,则将其评估为float 字符'。','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
答案 2 :(得分:5)
请参阅comparison operators的文档:
如果您将数字与字符串进行比较或比较涉及数字字符串,则每个字符串都会转换为数字,并且数字会进行比较。
所以不,这不是一个错误,它是语言的设计方式。
如果您不想进行类型杂耍,请使用===
。
答案 3 :(得分:2)
要注意,您还需要知道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)
答案 4 :(得分:1)
您也可以像这样使用
<?php
if( "32 is this a bug of php " == '32')
echo "true";
else
echo "false";
?>