phpはnullまたは空ですか?


208

NULLPHP に関する質問があります。

  $a = '';
  if($a == NULL) {
      echo 'is null';
  }

なぜ私が見るんnullのとき、$a空の文字列がありますか?それはバグですか?

回答:


348

あなたが探しているのは:

if($variable === NULL) {...}

に注意してください===
使用==した場合と同様に、PHPはNULLfalse0空の文字列、空の配列を同じものとして扱います


13
False、条件は初期化されていないnullにのみ一致します$variable。あなたが望むものは実際にあります:(に$variable == null注意してください==
Thomas LAURENT

6
@ThomasLAURENT、それはOPが探していたものであり、なぜ== nullnullや未定義だけでなく、空の文字列と一致するのか疑問に思っていました。
Godwin

3
間違いですが、最後の文でNULL、false、0、 ""は厳密に等しいと思いましたが、誤解して申し訳ありません。
トーマスLAURENT

3
@JamesこれはPHPの意図された動作であり、2017年でも依然として当てはまり、私は長い間当てはまると思います
Defrag

1
$a = ''は空stringfalseはブール値、$a = 0;整数、nullタイプはnullです。OPが言っていることは、PHPはそれらを値の「同じ」としてスレッド化するが、タイプの「同じ」としてスレッド化しないということです。したがって、厳密な ===チェックではタイプもチェックし、別のものを使用すると失敗します。これが、戻り値の一貫性を保つ必要がある理由です。通常、のようなメソッドで文字列を返す場合getName()null空の場合は取得しないでください。空の文字列 $user->getName() === ''または$user->getId() === 0orの可能性が高くなり$user->isActive === falseます。意図された動作!
Cagatay Ulubay

225

次の表に示すように、はとempty($foo)同等で、$foo==nullis_null($foo)同じ機能を持っています$foo===null。この表は、null比較に関するいくつかのトリッキーな値も示しています。(ϕは初期化されていない変数を示します。)

         empty    is_null 
         ==null  ===null  isset   array_key_exists
      ϕ |   T   |   T   |   F   |   F   
   null |   T   |   T   |   F   |   T   
     "" |   T   |   F   |   T   |   T   
     [] |   T   |   F   |   T   |   T
      0 |   T   |   F   |   T   |   T      
  false |   T   |   F   |   T   |   T   
   true |   F   |   F   |   T   |   T   
      1 |   F   |   F   |   T   |   T   
     \0 |   F   |   F   |   T   |   T   

empty()is_null()機能を使用することはありません。単純な比較を使用すると、あいまいさが減り、高速でクリーンになります。特に、一致する中括弧が少なくなります。

if($x==null || $y==null)if(is_null($x) || is_null($y))


2
表に「0」と「0.0」がありません。それらは物事を本当にトリッキーにし、特にempty()にします。それがempty()の使用を避ける理由です。
datasn.io

1
@PHPst表示したテーブルに基づいているので、実際に「単純な比較」と呼んだPHPコードは何ですか?
チェタバハナ2016

@hyip ==nullおよび===null
PHPst 2016

これが一番の答えで、もっと完全なはずです。ありがとう。
pgr

@PHPstあなたは単純な比較があいまいではないと言った。これらのNULL empty()などの代わりに単純な比較を使用する例を提供できますか
Naeem Ul Wahhab

28

チェック==vs===

'' == NULLtrueを返す、true
0 == NULLを返す、true
false == nullを返す

どこに

'' === NULLfalse
0 === NULLを返すfalse
false === NULLを返すfalseを返す


テストされ、正しい。'' == null(true)while '' === null(false)
TheLegendaryCopyCoder

18

いいえ、バグではありません。最初の列の各値を他の列の値と比較した結果を示す==テーブル(2番目のテーブル)の緩い比較を見てください。

    TRUE    FALSE   1       0       -1      "1"     "0"     "-1"    NULL    array() "php"   ""

    [...]    

""  FALSE   TRUE    FALSE   TRUE    FALSE   FALSE   FALSE   FALSE   TRUE    FALSE   FALSE   TRUE

あなたはそこに空の文字列があることがわかります""と比較してfalse0NULLまたは""真が得られます。

代わりにis_null [docs]を使用するか、厳密な比較(3番目の表)を使用できます。


緩やかな比較表は、0 == "php"または "php" == 0を比較するとどちらもtrueになることを示唆しているようです。何が起こっているのですか?
ロバート

1
@Robert:数字で始まっていない文字列は0、文字列にキャストしたときに次のように変換されます:codepad.org/qi40SG3E。ですから(int)"php" == 0
Felix Kling 2013年

@Robert:私は、意味「にキャストする場合の数
Felix Kling 2013年

12

これバグではなく、PHPの通常の動作です。これは==、PHP の演算子が型をチェックしないために発生します。

'' == null == 0 == false

値が同じタイプかどうかも確認したい場合は、===代わりに使用してください。この違いを深く研究するには、公式ドキュメントをお読みください。


8

を使用すると==、phpは空の文字列または配列をとして扱いますnull。間の区別を行うにnullしてempty、いずれかの使用===またはis_null。そう:

if($a === NULL) または if(is_null($a))


if($ a === NULL)
Caster


弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.