2009-08-15 5 views
0

私は、例えば、使用していることを知っている:文字列で厳密な比較を行うべきですか?

if (in_array('...'), array('.', '..', '...') === true) 

以上:

if (in_array('...'), array('.', '..', '...') == true) 

は、パフォーマンスを向上させ、(例えば、1 == true)のいくつかの一般的な間違いを避けることができ、しかし、私は場合は思ったんだけどそこ

if ('...' === '...') 

のようにまったく同じことをやっているようだ:

のような文字列の厳密な比較を、使用するための理由があります
if ('...' == '...') 

誰かがこの問題に少しでも光をあてることができたら、私はそれを感謝します。

答えて

6

両方の値が文字列であることがわかっている場合は、と===が同じです。これは、===が有効な値だけでなく、同じタイプかどうかをチェックする点です。

しかし、場合によっては、値が文字列になることがわからない場合があります。たとえば、$ _GETや$ _POST変数などがあります。次のことを考えてみましょう:

$_GET['foo'] == "" 

fooが空白の文字列として渡された場合は、上記の式はtrueに評価されますが、値が全てでfooのために渡されなかった場合、それはまた、真と評価されます。これとは対照的に、

$_GET['foo'] === "" 
空白の文字列が明示的に渡された場合にのみ真と評価されます

- そう$_GET['foo']の値が空の文字列に相当するかもしれないが、それは実際には空になりますので、タイプはないだろうそのインデックスの値であり、文字列ではありません。

+1

あなたの例では、値がまったく 'foo'に渡されなかった場合、PHP E_NOTICEレベルのエラーが発生します。 –

+0

ありがとうございました。 –

3

ので、あなたは厳密な比較を選択し、どちらか一方を使用することができます:それはあなたがまだ予期しない結果を持つことができる文字列を比較するときに予期しない結果

を防ぎ、より良いパフォーマンス

  • を持って

    1. 文字列が空であるか、文字列であると思われる変数が実際にはありません。

      常に2つの文字列リテラルの比較は、TRUEまたはFALSEに減らすことができるため、これを使用しません。たとえば:あなたは、常に少なくとも一つの変数を比較することになるので、

      if ('...' === '...') 
      

      だから

      if (TRUE) 
      

      と同じであるあなたが予期しない結果を持つことができることを前提としなければなりません。

      http://net-beta.net/ubench/には、さまざまな厳密な比較と緩やかな比較のベンチマーク結果が表示されます。私も自分のテストを実行して、同じ結果を見つけました。

      これは微妙な最適化です。つまり、既存のコードを変更する必要はないため、大きな違いはありませんが、新しいコードを書く場合は、最も効率的な手法を使用することもできます。

  • +0

    ありがとうございます。ところで、これらのテストhttp://net-beta.net/ubench/index.php?t=array10は同等ではないようです。そのサイトを運営していますか? –

    +0

    このサイトは参考情報です。私はそれを実行しません。 [net-beta.net/ubench/](http://net-beta.net/ubench/)はさまざまなベンチマークのコレクションです。 equal1 - equal7までスクロールすると、比較テストが見つかります。残念ながら、ページ全体にはidsや名前付きアンカーはありませんので、テストのグループに具体的にリンクすることはできません。 –

    関連する問題