3

可能重复:
比较两个变量返回错误结果

<?php
if( "32 is this a bug of php " == 32)
   echo "true";
else
   echo "false";
?>

输出是:

true

你可以在http://codepad.org/hgOisqZ8看到它的输出

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

4

5 回答 5

7

因为 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

于 2012-10-15T09:34:46.030 回答
6

这在PHP 手册中进行了讨论。

字符串转换为数字

在数字上下文中评估字符串时,结果值和类型确定如下。

如果字符串包含任何字符“.”、“e”或“E”,则该字符串将被评估为浮点数。否则,它将被评估为整数。

该值由字符串的初始部分给出。如果字符串以有效的数字数据开头,这将是使用的值。否则,该值将为 0(零)。有效的数字数据是一个可选的符号,后跟一个或多个数字(可选地包含一个小数点),后跟一个可选的指数。指数是“e”或“E”后跟一位或多位数字。

注意声明的部分

如果字符串以有效的数字数据开头,这将是使用的值。

由于您的字符串以32PHP 开头,因此会比较if(32 == 32)哪个为真。

使用类型安全检查,将数据类型考虑在内,如果不希望出现这种行为,则在处理可能不同的类型时。像

1 === 1:   true
1 == 1:    true
1 === "1": false
1 == "1":  true
"foo" === "foo": true
于 2012-10-15T09:35:40.827 回答
5

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

如果将数字与字符串进行比较或比较涉及数字字符串,则每个字符串都将转换为数字并以数字方式执行比较。

所以不,这不是错误,而是语言的设计方式。

===如果您不想打字杂耍,请使用。

于 2012-10-15T09:35:48.903 回答
2

请注意,您还需要知道$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)
于 2012-10-15T09:47:31.380 回答
1

你也可以这样使用

<?php
if( "32 is this a bug of php " == '32')
  echo "true";
else
  echo "false";
?>
于 2012-10-15T09:47:03.557 回答