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

时间:2012-10-15 09:33:10

标签: php if-statement

  

可能重复:
  comparing two variables returns false result

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

输出是:

true

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

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

5 个答案:

答案 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";
?>