将int与string进行比较会导致php出现奇怪的结果?

Jee*_*tel 3 php if-statement

可能重复:
比较两个变量返回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看到它的输出

为什么这个条件被评估为真?

Mar*_*ski 7

因为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中使用类型转换. (7认同)

inq*_*uam 6

这在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)


Que*_*tin 5

请参阅比较运算符的文档:

如果将数字与字符串进行比较或比较涉及数字字符串,则每个字符串将转换为数字,并且数字执行比较.

所以不,它不是一个错误,它是语言的设计方式.

使用===,如果你不想类型戏法.