在PHP中将整数与字符串进行比较会导致奇怪的结果吗?

3

你可以使用 ===(3个等号)来测试类型和值的相等性。 - PoeHaH
因为“32是php的一个bug”,当转换为int时变成了32。 - lc.
5个回答

7

由于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 的结果,因为一个变量是字符串类型,而另一个变量是整数类型。


7
我不会称之为“愚蠢”,这只是 PHP 中类型转换的工作方式。 - deceze
这就是为什么我称它为“相当愚蠢”而不是“完全愚蠢”的原因;) 在我看来,所有从字符串进行的隐式转换都是邪恶的,但我理解这是 PHP 的设计。 - Mariusz Sakowski

6

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

5
请参阅比较运算符文档:
如果您将数字与字符串进行比较,或者比较涉及数字字符串,则每个字符串都会转换为数字,并进行数值比较。
所以不,这不是一个错误,而是语言的设计。
如果您不想类型转换,请使用===

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)

这是因为在比较两个字符串时不需要进行转换。因此,这些字符串可以被视为字符串而不是数值。 - inquam
@inquam 在 PHP 中,“比较两个字符串时不需要进行转换”是不正确的,请参见https://dev59.com/-2cs5IYBdhLWcg3wwmrA。 - xdazz
对于这个特定情况,我的意思是。但确实如此。PHP 可以在我们的头脑中玩弄把戏 ;) - inquam

1

你也可以这样使用

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接