比较,!==与!=

时间:2011-06-15 11:13:14

标签: php comparison operators comparison-operators

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

但我发现很多人在比较价值时会使用!==,例如:

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

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

7 个答案:

答案 0 :(得分:13)

!=只比较价值是错误的。因为它比较类型,如果需要应用type conversion(参见table of Comparison with Various Types)然后比较(转换的)值。

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

答案 1 :(得分:5)

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

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

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

答案 2 :(得分:3)

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

但是,如果您确实要求并且参数应该与您期望的完全相同(例如,=== false当您不希望0通过相等性测试时),那么请使用{ {1}}或===

正如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;

这意味着两种情况下大约增加2秒。您可能会想,并且您将以某种方式正确,这证明了严格比较运算符的速度优势。但是不要忘记我们正在谈论4.4 seconds for == 2.4 seconds for === = 1亿次迭代。

这意味着一次严格的比较会使您的脚本加速1e6 * 100

如果您认为在编写脚本时应该考虑这一点,那么请执行此操作。但是你很快就会遇到其他微小的优化,它们会给你1000倍的速度增益,并使这种“优化”看起来毫无用处。这是一个过早优化的教科书案例。

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

答案 3 :(得分:2)

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

所以,如果你有

$i = "0";

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

如果你有

$j = 0;

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

答案 4 :(得分:2)

当您知道类型相同时,它并不是真的更快,在您的示例中就是这种情况。人们使用!==的主要原因是它使PHP不会执行type-juggling magic,因此比较的可能性更小,这意味着你不想要的东西。

答案 5 :(得分: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

答案 6 :(得分:1)

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