比较,!==与!=

| 我知道
!==
也用于比较变量类型,而
!=
仅比较值。 但是我看到许多人在比较值时会使用“ 0”,例如:
$stuff = \'foo\';
if($stuff !== \'foo\') // do...
他们有任何理由这样做吗? ѭ0比1快还是什么?     
已邀请:
        如果您确实事先知道两个变量的类型相同,则不会有任何区别。我认为速度差异可以忽略不计,因此可以(并且应该)完全忽略速度参数,因此您应该专注于应用程序,而不是过早(和不必要)的优化。 但是,如果确实有一个要求,并且参数应该恰好是您期望的值(例如,当您不希望
0
通过相等性测试时为
=== false
),则请使用
===
!==
。 如Headshota所述,如果您使用的是对象,则
===
检查两个变量是否实际上指向同一对象实例,而
==
尝试按值匹配它们,这可能会导致意外结果,应格外小心。在这里将使用严格运算符,因为这对应用程序意味着某些意义。 要回答您的问题,如果有人在使用context8ѭ或
!==
时您确实知道两个变量都是相同的(标量)类型,那么我猜这只是编码风格的问题,并且显示代码中的一些严格性,从而加强了两个变量属于同一类型的想法,可能不考虑性能。 如果需要这样做,则必须使用严格的运算符,而不是作为性能优化。 更新:要回复速度参数,让我们考虑这个小的基准:
$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 ===
现在,如果我使用ѭ16来强制进行隐式转换,我将大致得到:
4.4 seconds for ==
2.4 seconds for ===
在两种情况下,这大约意味着2秒的增益。您可能会以某种方式认为是正确的,这表明了严格比较运算符的速度优势。但是请不要忘记,我们所说的是
1e6 * 100
= 1亿次迭代。 这意味着一次严格的比较将使脚本速度提高19英镑。 如果您认为这是编写脚本时应考虑的事情,请这样做。但是您很快就会遇到其他微小的优化,这些优化将使您获得1000倍的速度提升,并使这种“优化”看起来毫无用处。这是过早优化的教科书。 同样,如果需要,请使用严格比较运算符,因为这是代码中的要求。出于性能原因,请勿使用它。     
        说“ 1”仅比较值是错误的。因为它比较类型,所以在必要时应用类型转换(请参阅“各种类型比较”表),然后比较(转换后的)值。 与此相反,如果类型不相等并且没有进行类型转换,则“ 0”会较早失败。     
        
!=
运算符要慢一些,因为它在必要时包括隐式转换, 而
!==
先比较类型然后再比较值(仅当类型相等时) 另外,请遵循此答案以获取有关两个操作数之间差异的更多信息     
        
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
    
        实际上,!==并不用于比较变量类型,而是用于确保要比较的值是相同类型且具有相同值。 所以如果你有
$i = \"0\";
$i == 0
将返回true,而
$i === 0
将返回false。 如果你有
$j = 0;
$j == null
将返回true,而
$j === null
将返回false。     
        当您知道类型相同时,速度并不是真的快,在您的示例中就是这种情况。人们使用“ 0”的主要原因是,它使PHP无法执行其类型变魔术,因此进行比较的可能性较小,这意味着您不希望这样做。     
        通常检查身份比使用安全性更为安全,这样可以避免无效类型导致的许多错误。但是在某些情况下,身份不是必须的,因此在这种情况下可以使用相等性。     

要回复问题请先登录注册