6

値のみを比較!==しながら、変数の型を比較す​​るためにも使用されることを私は知っています。!=

しかし、多くの人が!==値を比較するときに使用していることがわかります。たとえば、次のようになります。

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

彼らがこれを行う理由はありますか?または何!==よりも速いですか?!=

4

7 に答える 7

13

!=値を比較するだけだと言うのは間違っています。むしろ型を比較す​​るため、必要に応じて型変換を適用し (さまざまな型との比較の表を参照)、(変換された) 値を比較します。

それとは対照的に!==、型が等しくなく、型変換が行われない場合は、以前に失敗します。

于 2011-06-15T11:17:05.683 に答える
5

必要に応じて暗黙的な変換が含まれているため、!=演算子少し遅くなります。

while!==は前の型を比較してから値を比較します (型が等しい場合のみ)

また、 2つのオペランドの違いに関する詳細については、この回答に従ってください

于 2011-06-15T11:16:08.403 に答える
3

両方の変数が同じ型であることが事前にわかっている場合、違いはありません。速度の違いはごくわずかであるため、速度の引数を完全に無視することができ (また無視する必要があります)、時期尚早の (そして不必要な) 最適化に集中するのではなく、アプリケーションに集中する必要があると思います。

ただし、 and 引数が期待どおりである必要がある場合 (たとえば、等価テストに合格し=== falseたくない場合) は、 orを使用します。0===!==

Headshota が述べたように、オブジェクトを操作している場合、===は 2 つの変数が実際に同じオブジェクト インスタンスを指していることを確認します==が、値によってそれらを一致させようとするため、予期しない結果が生じる可能性があり、細心の注意を払って使用する必要があります。ここでは、アプリケーションにとって何らかの意味があるため、厳密な演算子が使用されます。

あなたの質問に答えるために、あなたの特定のコンテキストで何人かの人々が使用している場合、===または!==両方の変数が同じ(スカラー)タイプであることを知っている場合、それはコーディングスタイルの問題であり、コードで、両方の変数が同じ型であるという考えを強制しますが、おそらくパフォーマンスは考慮されていません。

厳密な演算子は、パフォーマンスの最適化としてではなく、そうする必要がある場合に使用する必要があります。

更新:速度の議論に答えるために、この小さなベンチマークを考えてみましょう:

$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 億回の反復であることを忘れないでください。

つまり、厳密な比較を 1 回行うだけで、スクリプトが .1 倍速くなります0.00000002 seconds

スクリプトを作成するときにこれを考慮する必要があると思われる場合は、そうしてください。しかし、すぐに、この 1000 倍の速度向上を実現する他の小さな最適化に遭遇し、そのような「最適化」が役に立たないように見えます。これは時期尚早の最適化の教科書的なケースです。

繰り返しますが、必要に応じて厳密な比較演算子を使用してください。これはコードの要件であるためです。パフォーマンス上の理由から使用しないでください

于 2011-06-15T11:19:10.363 に答える
2

実際には、!== は変数の型を比較す​​るために使用されるのではなく、比較される値が同じ型であり、同じ値を持つことを保証するために使用されます。

だからあなたが持っているなら

$i = "0";

$i == 0は true を返しますが、$i === 0false を返します。

あなたが持っている場合

$j = 0;

$j == nullは true を返しますが、$j === nullfalse を返します。

于 2011-06-15T11:17:15.253 に答える
2

タイプが同じであることがわかっている場合、実際には高速ではありません。これは、例の場合です。人々が使用する主な理由!==は、PHP が型ジャグリングの魔法を実行しないようにするためです。そのため、比較が望ましくないことを意味する可能性が低くなります。

于 2011-06-15T11:17:43.783 に答える
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
于 2011-06-15T11:19:31.133 に答える
1

一般に、同一性をチェックするよりも同一性をチェックする方が安全です。これにより、無効な型によって引き起こされる多くのエラーを回避できます。ただし、ID が必須ではない場合もあるため、この場合は等価を使用できます。

于 2011-06-15T11:16:04.047 に答える