【问题标题】:The importance of using === instead of == in php! [duplicate]在 php 中使用 === 而不是 == 的重要性! [复制]
【发布时间】:2011-03-06 07:16:06
【问题描述】:

直到今天我才注意到并发现了使用 === 运算符的重要性。您可以在以下示例中看到它:

$var=0;
if ($var==false) echo "true"; else echo "false";  //prints true
$var=false;
if ($var==false) echo "true"; else echo "false";  //prints true
$var=0;
if ($var===false) echo "true"; else echo "false";  //prints false
$var=false;
if ($var===false) echo "true"; else echo "false";  //prints true 

问题是,在任何情况下使用 === 运算符而不是 == 运算符很重要?

【问题讨论】:

  • 你可以说echo $var == false;等等。
  • @Chris。我已经看过那个问题了。但我的问题是关于示例,考虑使用“===”运算符而不是“==”运算符非常重要。
  • @Skilldrick:不,你不能。 PHP 不会自动将布尔值转换为“true”/“false”字符串。您的示例将产生1(对于true)或空字符串(对于false)。但是,可以通过使用三元运算符来缩短示例,如下所示:print ($var == false) ? 'true' : 'false';
  • @Jakob:很公平!好点子。

标签: php comparison-operators


【解决方案1】:

当然,只是一个例子:array_search()

警告

此函数可能返回布尔值FALSE,但也可能返回计算结果为FALSE 的非布尔值,例如0""。请阅读有关布尔值的部分以获取更多信息。使用===操作符来测试这个函数的返回值。

基本上,如果您使用任何成功返回值但失败时返回FALSE 的函数,您应该使用=== 检查结果以确定(否则为什么会有大红色警告框?;))


更多示例:next()current()
或者也提到了strpos()stripos()等字符串函数。

即使是substr(),虽然没有明确提及:

返回提取的字符串部分,失败时返回 FALSE。

但是如果提取的部分是"0"呢?它也计算为FALSE,但这不是错误。

【讨论】:

  • nextcurrent 不是很好的例子。如果有像array(false) 这样的 false 值怎么办?
  • @Gumbo:没错。我刚刚提到它们是因为它们的文档中也有这个警告框。但是有一个注意事项(应该更加强调恕我直言): 注意:您将无法区分数组的结尾和布尔值 FALSE 元素。要正确遍历可能包含 FALSE 元素的数组,请参阅 each() 函数。
【解决方案2】:

始终选择=== 而不是==,除非您绝对确定需要==,因为== 不具有传递性。这反过来又对您推理代码很重要。

考虑下面的代码sn-p

if ( $a == $b && $b == $c ) {
    // [1] assert: $a == $c
}

任何人都会从 if 条件中推断出断言$a == $c 为真,因为我们已经习惯了等式关系是可传递的。但这不适用于==,反例:

$a = "0";
$b = 0;
$c = null;

现在想想我们在编写代码时(有时不自觉地)做出这种假设的频率。这可能会导致严重的错误。

【讨论】:

    【解决方案3】:

    strpos() 中,找到字符串时为 0,丢失时为 false。您必须使用=== 来检查差异。

    【讨论】:

      【解决方案4】:

      ===strict type comparison 运算符,它不仅会检查 values 还会检查它们的 type== 只检查是否 values 相同。

      考虑比较数字或字符串的情况:

      if (4 === 4) // same type and value
      {
        // true
      }
      

      但是

      if (4 == "4") // same value but different type
      {
        // true
      }
      

      if (4 === "4") // same value but different type
      {
        // false
      }
      

      因此,在上述情况下,您必须做出明智的选择是使用 == 还是 ===

      【讨论】:

      • 是的,我知道。但我想找出使用​​一个运算符而不是另一个运算符很重要的示例。
      • 以 Felix Kling 的回复为例。他明白我想要什么。
      • @Bakhtiyor:正如您在我的示例中看到的,这在比较数字和字符串时也很有用:)
      • 现在,我可以看到,但是在对您的回答发表评论时,没有示例。例如,谢谢。
      【解决方案5】:

      比较 0 和字符串 fx 是一个很好的例子,你可能会遇到麻烦

      if (0 == 'completed') {
        // evaluates as TRUE
      }
      

      不以数字开头的字符串在转换为 int 时变为 0。在将可以为 0 的状态与字符串进行比较时,这可能会成为问题。

      【讨论】:

        【解决方案6】:

        === 运算符检查类型和值是否相等。

        这就是0 === false 不返回 true 的原因,因为它们的类型不同。

        【讨论】:

          【解决方案7】:

          strpos($needle,$haystack) 如果 $needle 在 $haystack 中不存在,则 strpos($needle,$haystack) 和相关函数将返回 false,如果 $needle 是 $haystack 的第一个字符则返回 0;并且有很多类似的功能。 在这种情况下,使用 == 会给您带来不正确的结果,因此您应该始终使用 ===。手册清楚地指出了哪里是必要的。

          【讨论】:

            【解决方案8】:

            我最近在编写快速 SQL 查询解析器时遇到了这个问题。简而言之,我将引用的参数与它们的极端情况占位符进行比较。基本上,下面的代码让我经历了一些艰难的调试(例子当然是简化的)

            $var = 0; // This is supplied dynamically
            
            $someCondition = $var == '?';
            

            $someCondition 最终始终为真。 颤抖

            基本上任何非严格 (==) == 比较都会导致字符串被强制转换为整数。根据输入,这可能最终为 0 或字符串的 int 值(如果有),即使整个字符串不是完全数字。

            【讨论】:

              【解决方案9】:

              如果比较两个数字字符串,它们将作为整数进行比较。1

              var_dump("15" == "0xF"); // TRUE
              var_dump("15" === "0xF"); // FALSE
              

              而 TRUE 间接等于 FALSE 2

              $a = 0;
              $b = 'x';
              var_dump(FALSE == $a); // TRUE
              var_dump($a == $b);  // TRUE
              var_dump($b == TRUE);  // TRUE
              var_dump(FALSE === $a); // FALSE
              var_dump($a === $b);  // FALSE
              var_dump($b === TRUE);  // FALSE
              

              【讨论】:

                猜你喜欢
                • 2012-05-16
                • 2012-06-04
                • 2012-09-05
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2019-01-20
                • 1970-01-01
                相关资源
                最近更新 更多