可能重复:
比较两个变量返回false结果
<?php
if( "32 is this a bug of php " == 32)
echo "true";
else
echo "false";
?>
Run Code Online (Sandbox Code Playgroud)
输出是:
true
Run Code Online (Sandbox Code Playgroud)
你可以在http://codepad.org/hgOisqZ8看到它的输出
为什么这个条件被评估为真?
因为PHP在类型转换方面非常愚蠢.
这个表达式是通过首先将"32 is this a php of php"转换为整数来计算的,其结果为32.然后比较结果为true.
如果要进行类型安全比较,请使用===运算符
<?php
if( "32 is this a bug of php " === 32)
echo "true";
else
echo "false";
?>
Run Code Online (Sandbox Code Playgroud)
输出将为false.
请注意,使用===运算符我们得到的"32" !== 32是因为一个变量就是string其他变量int
这在PHP手册中讨论.
字符串转换为数字
在数值上下文中计算字符串时,结果值和类型将按如下方式确定.
如果字符串包含任何字符'.','e'或'E',则将其评估为float.否则,它将被评估为整数.
该值由字符串的初始部分给出.如果字符串以有效数字数据开头,则这将是使用的值.否则,该值将为0(零).有效数字数据是可选符号,后跟一个或多个数字(可选地包含小数点),后跟可选指数.指数是'e'或'E',后跟一个或多个数字.
请注意声明的部分
如果字符串以有效数字数据开头,则这将是使用的值.
因为你的字符串以32PHP 开头将比较if(32 == 32)哪个是真的.
如果不需要此行为,则在处理可能不同的类型时,请使用类型安全检查(将数据类型考虑在内).喜欢
1 === 1: true
1 == 1: true
1 === "1": false
1 == "1": true
"foo" === "foo": true
Run Code Online (Sandbox Code Playgroud)