6

我知道这!==也用于比较变量类型,而!=只比较值。

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

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

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

4

7 回答 7

13

!=只比较值是错误的。因为它比较类型,所以在必要时应用类型转换(参见与各种类型的比较表),然后比较(转换后的)值。

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

于 2011-06-15T11:17:05.683 回答
5

!=运算符有点因为它在必要时包含隐式转换,

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

此外,请按照答案了解有关两个操作数之间差异的更多信息

于 2011-06-15T11:16:08.403 回答
3

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

但是,如果您确实要求和参数应该完全符合您的期望(例如,=== false当您不想0通过相等性测试时),请使用===or !==

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

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

严格的运算符必须在有意义的情况下使用而不是作为性能优化。

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

$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 倍的速度增益,并且让这些“优化”看起来毫无用处。这是一个过早优化的教科书案例。

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

于 2011-06-15T11:19:10.363 回答
2

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

所以如果你有

$i = "0";

$i == 0将返回真,而$i === 0将返回假。

如果你有

$j = 0;

$j == null将返回真,而$j === null将返回假。

于 2011-06-15T11:17:15.253 回答
2

当您知道类型相同时,它并不是真的更快,在您的示例中就是这种情况。人们使用的主要原因!==是它使 PHP 无法发挥其类型杂耍的魔力,因此比较意味着您不想要的东西的可能性较小。

于 2011-06-15T11:17:43.783 回答
2
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
于 2011-06-15T11:19:31.133 回答
1

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

于 2011-06-15T11:16:04.047 回答