PHP - 使用==(等于)和===(相同)的意外行为

时间:2012-11-13 17:44:25

标签: php

我的代码中有以下内容:

$mixed = array();
$mixed[0] = "It's a zero!";
$mixed['word'] = "It's a word!";   

foreach ($mixed as $key => $value) {
  if ($key == 'word') {             
    echo $value.'<br />';
  } 
}

以上由于某种原因打印出“它是零!”和“这是一个字!”。我期待它只打印“这是一个字!”。这是为什么??我觉得我错过了一些重要的东西。当我在if语句中使用===时,它按预期工作,换句话说,它只打印“这是一个单词!”。我知道相等和相同的运算符之间存在差异,但第一个例子不相同吗?

4 个答案:

答案 0 :(得分:5)

==在比较之前为您进行类型转换。

当您使用整数==执行0时,它会将'word'转换为相应的整数值

intval() 在提供纯字符串时返回 0 ,因此匹配为0。另一个在字符串上下文中匹配,也匹配。


===执行没有这样的隐式转换,因此只有在一种情况下,当字符串实际上相同时才返回true。

答案 1 :(得分:1)

PHP变量有类型。

==在转换为相同类型后检查相等性,===也检查类型。使用var_dump查看实际类型。

答案 2 :(得分:1)

见上文@Cthulhu的回答很明显。

除此之外,这是一个不同的例子。 strpos()函数返回needle haystack的位置。

<?php
 $pos_a = strpos('apple', 'a'); // a is in the first position.
 $pos_b = strpos('apple', 'b'); // there is no b.
 if ($pos_a){
    echo 'we got a!'."\n";
 }
 if  ($pos_b){
    echo 'we got b!'."\n";
 }
如果找不到针,

strpos会返回FALSE。但是你会看到php没有运行任何echo语句。

如果您var_dumo()了解这两个值,您会看到$pos_a$pos_b包含0FALSE

if语句失败,因为0FALSE都被视为FALSE,除非您使用===

现在试试这个:

 <?php
 $pos_a = strpos('apple', 'a'); // a is in the first position.
 $pos_b = strpos('apple', 'b'); // there is no b.
 if ($pos_a !== FALSE){
    echo 'we got a!'."\n";
 }
 if  ($pos_b !== FALSE){
    echo 'we got b!'."\n";
 }

现在你会看到所需的结果,因为它回声“我们得到了!”。

答案 3 :(得分:0)

$ a == $ b如果在类型杂耍后$ a等于$ b,则等于TRUE。 $ a === $ b如果$ a等于$ b,则相同为TRUE,它们属于同一类型。

看起来

如果对带有==的字符串检查0,则PHP返回true:

php -r'var_dump(0 ==“status”);' - &GT;返回TRUE

但如果您的字符串在开头有一个数字,则不会这样:

php -r'var_dump(0 ==“2statuses”);' - &GT;返回FALSE

从规范我得到它尝试转换 - 在这种情况下字符串编号。

更好用===

http://php.net/manual/en/language.operators.comparison.php