我知道!==
也用于比较变量类型,而!=
仅比较值。
但我发现很多人在比较价值时会使用!==
,例如:
$stuff = 'foo';
if($stuff !== 'foo') // do...
他们有什么理由这样做吗? !==
比!=
更快还是什么?
答案 0 :(得分:13)
说!=
只比较价值是错误的。因为它比较类型,如果需要应用type conversion(参见table of Comparison with Various Types)然后比较(转换的)值。
与此相反,如果类型不相等且没有进行类型转换,!==
会提前失败。
答案 1 :(得分:5)
答案 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)
检查身份通常比平等更安全,这可以避免由无效类型引起的许多错误。但有些情况下,身份不是必须的,因此在这种情况下你可以使用平等。