【问题标题】:comparing, !== versus !=比较,!== 与 !=
【发布时间】:2011-09-15 10:57:00
【问题描述】:

我知道!==也是用来比较变量类型的,而!=只比较值。

但我看到很多人在比较值时使用!==,例如:

$stuff = 'foo';
if($stuff !== 'foo') // do...

他们这样做有什么理由吗? !==!= 快还是什么?

【问题讨论】:

标签: php comparison operators comparison-operators


【解决方案1】:

!= 只比较值是错误的。因为它比较的是类型,所以在必要时应用type conversion(请参阅table of Comparison with Various Types),然后比较(转换后的)值。

与此相反,!== 如果类型不相等且未进行类型转换,则会提前失败。

【讨论】:

  • 添加一个极端的例子:在 PHP 0 == 'string'.
【解决方案2】:

!= 操作符有点,因为它在必要时包含一个隐式转换,

!== 比较之前的类型,然后比较值(仅当类型相等时)

另外,请关注this 回答以获取有关两个操作数之间差异的更多信息

【讨论】:

  • 有关性能参数的演示,请参阅下面的评论。
  • @Benjamin 在查看问题时给定答案的随机位置,当我输入此评论时,您的答案在上面...但是当您阅读此内容时,它可能在下面!
  • @Zoidberg:是的,我意识到为时已晚 :) 让我们重新表述为“看我的评论”,点。
【解决方案3】:

如果您事先知道这两个变量属于同一类型,则不会有任何区别。我认为速度差异可以忽略不计,可以(并且应该)完全忽略速度参数,您应该专注于您的应用程序,而不是专注于过早(和不必要的)优化。

但是,如果您确实要求和参数应该完全符合您的期望(例如,=== false,当您不希望 0 通过相等性测试时),然后使用 === 或 @ 987654324@.

正如 Headshota 所提到的,如果您正在处理对象,那么 === 会检查这两个变量是否实际上指向同一个 对象实例,而 == 会尝试按值匹配它们,这可能会导致意想不到的结果,应谨慎使用。这里将使用 strict 运算符,因为它对应用程序有意义。

要回答您的问题,如果在您的特定上下文中有些人使用 ===!==,而您确实知道这两个变量属于相同(标量)类型,那么我想这只是编码风格的问题,并在代码中表现出一些严格性,强制执行两个变量属于同一类型的想法,可能没有考虑到性能。

必须使用严格的运算符当它意味着这样做时,而不是作为性能优化。

更新:回复速度参数,让我们考虑这个小基准:

$a = "test";
$b = "test";

$t = microtime(true);
for ($i=0; $i<1e6; $i++) {
    ($a == $b);
    // (100x the equality test, omitted for clarity purposes,
    //  to lower the speed impact of the loop itself)
    ($a == $b);
}
printf('%.3f', microtime(true)-$t);

我大概明白了:

6.6 seconds for ==
4.3 seconds for ===

现在,如果我使用 $b = 1; 强制进行隐式转换,我会大致得到:

4.4 seconds for ==
2.4 seconds for ===

这意味着在这两种情况下都大约增加了 2 秒。你可能会认为,而且你在某种程度上是对的,这是对严格比较运算符速度优势的证明。但别忘了我们说的是1e6 * 100 = 1 亿次迭代。

这意味着一个严格的比较将使您的脚本加速0.00000002 seconds

如果您认为这是您在编写脚本时应该考虑的事情,那么就这样做。但是您很快就会遇到其他微小的优化,它们会给您带来 1000 倍的速度增益,并且让这些“优化”看起来毫无用处。这是一个过早优化的教科书案例。

同样,如果必须,请使用严格的比较运算符,因为这是代码中的要求。 不要出于性能原因使用它

【讨论】:

    【解决方案4】:
    For example
    
    $flag = 0;
    if($flag == false ){
       echo "true";
    }else{
       echo "false";
    }                      // echo true;
    
    
    $flag = 0;
    if($flag === false ){
       echo "true";
    }else{
       echo "false";
    }                     // echo false;
    
    
    $flag = false;
    if($flag === false ){
       echo "true";
    }else{
       echo "false";
    }                    // echo true
    

    【讨论】:

      【解决方案5】:

      其实!==并不是用来比较变量类型的,它是用来保证被比较的值是同一类型,并且具有相同的值。

      如果你有

      $i = "0";
      

      $i == 0 将返回 true,而 $i === 0 将返回 false。

      如果你有

      $j = 0;
      

      $j == null 将返回 true,而 $j === null 将返回 false。

      【讨论】:

        【解决方案6】:

        当您知道类型相同时,它并不是真的更快,在您的示例中就是这种情况。人们使用!== 的主要原因是它阻止了PHP 做它的type-juggling magic,所以比较的机会更少意味着你不想要它。

        【讨论】:

          【解决方案7】:

          检查身份通常比检查相等更安全,这避免了许多由无效类型引起的错误。但在某些情况下,身份不是必须的,因此您可以在这种情况下使用相等。

          【讨论】:

            猜你喜欢
            • 2021-07-14
            • 2016-10-22
            • 1970-01-01
            • 2014-04-23
            • 2011-03-27
            • 1970-01-01
            • 2016-05-14
            • 2011-07-29
            • 2013-11-12
            相关资源
            最近更新 更多