如果将0与字符串变量比较,条件仅在0的情况下成立。

3
以下代码的输出结果为“fail”,但如果我们将$b赋值为1,则输出结果将变为“pass”。有人能告诉我为什么这个if条件语句只对0成立吗?
<?php 
      $a="abcd"; 
      $b=0; 
      if($a == $b)
      {
         echo "fail";
      } 
      else
      { 
         echo "pass";
      }
?>

3
阅读有关宽松类型比较的所有内容。 - Mark Baker
1
再次提醒:使用 == 运算符进行 PHP 类型判断。 - Alma Do
@Christoph:如果 ($a = '123'),它总是会通过 ;) - JimL
1
@JimL $a = "123"; <- 你在if语句中经常使用分号吗?! - Christoph Diegelmann
1
@Christoph:说得好,我还在试图聪明一些呢^^ - JimL
显示剩余3条评论
4个回答

1
那是因为PHP在使用==运算符时进行了类型转换。完整的表格可以在这里找到。

1
由于您正在比较两个不同类型的变量,其中之一将被转换。在这种情况下,字符串将被转换为整数,对于不以数字值开头的字符串,其值将为0。
因此,在PHP中,"abc" == 0,要添加类型检查,请使用"abc" === 0

没有什么比新鲜的点赞更能表达“谢谢”的心情了。当你的问题得到解决时,别忘了将一个答案标记为已接受。 - NDM
我该在哪里找到那个选项? - Jamie
它说投赞成票需要15个声望。对我无效 :( - Jamie
给你点个赞,顺便回答一下你的问题。我认为将一个答案标记为正确答案不应该需要任何声望值。 - NDM

0
你遇到了类型转换的问题。尝试使用全等比较运算符===,它还会检查变量的类型是否相同:
var_dump('abcd' === 0); // bool(false)

非空字符串不会被视为假。 - Michael Berkowski
阅读文档:http://php.net/manual/zh/language.operators.comparison.php - ComFreek
抱歉,我编辑了我的回答。 - George Brighton

0

来自PHP手册

如果您将数字与字符串进行比较或比较涉及数字字符串,则每个字符串都会转换为数字并进行数字比较。当比较为===或!==时,不进行类型转换,因为这涉及比较类型以及值。

if($a==$b) { 
    echo "fail";
} 
else { 
    echo "pass";
}

这将会输出 fail

但是,如果你使用全等比较运算符 ===,就不会发生类型转换:

if($a===$b) { 
    echo "fail";
} 
else { 
    echo "pass";
}

这将输出 pass。

更多细节,请参阅 PHP 手册中 type juggling 文档。


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