我知道这!==
也用于比较变量类型,而!=
只比较值。
但我看到很多人!==
在比较值时使用,例如:
$stuff = 'foo';
if($stuff !== 'foo') // do...
他们这样做有什么理由吗?是!==
快于!=
还是什么?
我知道这!==
也用于比较变量类型,而!=
只比较值。
但我看到很多人!==
在比较值时使用,例如:
$stuff = 'foo';
if($stuff !== 'foo') // do...
他们这样做有什么理由吗?是!==
快于!=
还是什么?
如果您事先知道两个变量属于同一类型,那么它不会有任何区别。我认为速度差异可以忽略不计,可以(并且应该)完全忽略速度参数,您应该专注于您的应用程序,而不是专注于过早的(和不必要的)优化。
但是,如果您确实要求和参数应该完全符合您的期望(例如,=== 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 倍的速度增益,并且让这些“优化”看起来毫无用处。这是一个过早优化的教科书案例。
同样,如果必须,请使用严格的比较运算符,因为这是代码中的要求。不要出于性能原因使用它。
实际上,!== 不是用来比较变量类型的,它是用来确保被比较的值是相同的类型并且具有相同的值。
所以如果你有
$i = "0";
$i == 0
将返回真,而$i === 0
将返回假。
如果你有
$j = 0;
$j == null
将返回真,而$j === null
将返回假。
当您知道类型相同时,它并不是真的更快,在您的示例中就是这种情况。人们使用的主要原因!==
是它使 PHP 无法发挥其类型杂耍的魔力,因此比较意味着您不想要的东西的可能性较小。
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
检查身份通常比检查相等更安全,这避免了许多由无效类型引起的错误。但是在某些情况下,身份不是必须的,因此您可以在这种情况下使用相等。