2

我的代码中有以下内容:

$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 />';
  } 
}

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

4

4 回答 4

5

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

当你==用一个整数做 an 时0,它会转换'word'成适当的整数值

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


===没有这样的隐式转换,所以它只在一种情况下返回 true,即字符串实际上是相同的。

于 2012-11-13T17:46:20.783 回答
1

PHP 变量有类型。

==转换为相同类型后检查相等性,===还检查类型。用于var_dump查看真正的类型是什么。

于 2012-11-13T17:45:26.367 回答
1

请参阅上面@Cthulhu 的答案,这很清楚。

除此之外,这是一个不同的例子。 strpos()函数返回needlefrom的位置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";
 }

strposFALSE如果找不到针,则返回。但是你会看到 php 没有运行任何 echo 语句。

如果您var_dumo()d 这 2 个值,您将看到$pos_a$pos_b包含0and FALSE

if语句刚刚失败,因为除非您使用 === 否则0两者FALSE都被考虑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";
 }

现在您将看到所需的结果,因为它回显“我们得到了!”。

于 2012-11-13T17:58:21.833 回答
0

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

看起来

如果您使用 == 检查字符串 0,则 PHP 返回 true:

php -r 'var_dump(0 == "statuses");' -> 返回 TRUE

但如果您的字符串开头有一个数字,则不是:

php -r 'var_dump(0 == "2statuses");' -> 返回 FALSE

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

所以更好用===

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

于 2012-11-13T17:52:00.943 回答