比较,!==与!=

Ale*_*lex 6 php comparison operators comparison-operators

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

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

$stuff = 'foo';
if($stuff !== 'foo') // do...
Run Code Online (Sandbox Code Playgroud)

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

Gum*_*mbo 13

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

与此相反,!==如果类型不相等且没有进行类型转换,则更早失败.


VAS*_*hhh 5

所述!=操作者有点,因为它包括一个隐式转换如果必要的话,

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

此外,请按照答案进一步了解两个操作数之间的差异


Ben*_*min 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);
Run Code Online (Sandbox Code Playgroud)

我大致得到:

6.6 seconds for ==
4.3 seconds for ===
Run Code Online (Sandbox Code Playgroud)

现在,如果我使用$b = 1;强制隐式转换,我大致得到:

4.4 seconds for ==
2.4 seconds for ===
Run Code Online (Sandbox Code Playgroud)

这意味着在这两种情况下大约都有 2 秒的增益。您可能会认为(在某种程度上您是对的),这证明了严格比较运算符的速度优势。但不要忘记我们正在谈论1e6 * 100= 1 亿次迭代。

这意味着一次严格比较将使您的脚本速度加快0.00000002 seconds.

如果您认为这是编写脚本时应该考虑的事情,那么就这样做。但您很快就会遇到其他微小的优化,这些优化将为您提供 1000 倍的速度增益,并使此类“优化”看起来毫无用处。这是过早优化的教科书案例。

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