is_null($ var)と($ var === null)の違いは何ですか?


83

これに違いはありますか...

if (is_null($var)) {
    do_something();
}

この?

if ($var === null) {
    do_something();
}

変数にnullが含まれているかどうかを確認する場合、どちらの形式が適していますか?知っておくべきエッジケースはありますか?(私はすべての変数を初期化するので、存在しない変数は問題ではありません。)


5
===明示的な関数ではないので、演算子の方が速いと思うかもしれません...しかし、私は1、2回驚いています。
John Giotta 2011年

回答:


30

変数が初期化されている場合(これは、このコンテキストでこれが重要かどうかは100%わかりませんが、変数が定義されていない場合は両方のソリューションで警告がスローされる可能性があります)、機能的には同じです。私は推測します===関数呼び出しのオーバーヘッドがなくなるので、わずかに高速になるとます。

それは本当にあなたがあなたの状態をどのように見るかに依存します。

===厳密なデータ比較用です。NULLには「値」が1つしかないため、これはNULL(nullの「値」のPHP定数)と比較するために機能します。

is_null 変数がNULLデータ型であることを確認しています。

本当にあなたが選ぶのはあなた次第です。


2
値による比較とタイプによる比較について説明していただきありがとうございます。
kijin 2011年

4
の代わりis_nullに誤って使用するのは簡単なので、私はバリアントを好みます。は(他の回答を参照)と同じであるため、これは、単純で読みやすいよりもプログラマー(特にジュニアおよびミドルレベル)エラーの可能性が高くなります。== null=== null== nullemptyis_null
ryanm 2017年

101

です true

です false

        | isset   | is_null | ===null | ==null  | empty   |
|-------|---------|---------|---------|---------|---------|
|  null |    ❌   |    ✅   |    ✅   |    ✅  |    ✅   |
|  true |    ✅   |    ❌   |    ❌   |    ❌  |    ❌   |
| false |    ✅   |    ❌   |    ❌   |    ✅  |    ✅   |
|     0 |    ✅   |    ❌   |    ❌   |    ✅  |    ✅   |
|     1 |    ✅   |    ❌   |    ❌   |    ❌  |    ❌   |
|    \0 |    ✅   |    ❌   |    ❌   |    ❌  |    ❌   |
| unset |    ❌   |    ✅   |    ✅   |    ✅  |    ✅   |
|   ""  |    ✅   |    ❌   |    ❌   |    ✅  |    ✅   |

概要:🔸♦️🔸

  • empty と同等です ==null
  • is_null と同等です ===null
  • isset逆数であるis_nullとは、===null

12
私はこのテーブルが大好きです。
Cheok Yan Cheng

3
それは、テーブルがもう少し明確な名前の最初の列に持つようになるかもしれない$vいくつかの一般的な変数を表すために、その後、他の人isset($v)is_null($v)$v===nullなど
Brandin

@Brandin提案をありがとう。答えを自由に編集してください。
PHPst 2014年

4
@Pacerier明らかに同等であるとのことで、機能的な違いはありません。
PHPst 2015年

1
isset未定義の変数について文句を言うことはなく、falseを返します。is_nullまたは=== nullを使用すると、通知が表示されます。
user1431317 2016年

17

どちらもまったく同じis_nullです。コードが読みやすくなるため、使用しています。


3
===は最初は速いかもしれませんが、PHPオプティマイザーはそれを修正する必要があります。
foo

10
is_nullは実際にはあまり明確ではないと感じています。うまく読めるかもしれ $v === nullませんが、比較が厳密なセマンティクスで行われることは間違いありませんが、をis_null($v)使用すると、一部のコーダーはそれがセマンティクスを使用するの===か、それとも==セマンティクスを使用するのか疑問に思います。
ヤギ

4
@ goat、ish1301、また、完全に削除または再定義is_nullできますが、常に機能します。=== null
Pacerier 2015年

@Pacerierは興味深いものですが、誰かがrunkit peclパッケージをインストールし、組み込み関数を削除できるように設定してから、is_nullを何かに置き換えることなく削除できるように設定すると、nilに非常に近くなります。あなたが好む。人がis_nullを削除したい場所について私が考えることができる唯一のシナリオは、null比較の動作をグローバルに変更したい場合です。例えば; 未設定の場合、trueではなくfalseを返します。この場合、実際には、コードが最初にis_nullで記述されている場合にのみ可能です。
kaan_a

7

phpが非常に多くのis_foo()型関数を持つことが冗長であると思われる場合、標準の比較演算子を使用できる場合は、プログラムで呼び出される関数を検討してください。

$arrayOfNullValues = array_filter($myArray, 'is_null');

$arrayWithoutNullValuesのみ を持つ配列を格納しnullます。
PointedEars 2012

5

簡単なベンチマークを実行して、それぞれの100万回の反復をテストしました。is_null完了するまでに8秒かかりました。=== null1を取りました。

したがって、への呼び出しis_nullは、への呼び出しよりも0.000007秒遅くなります。===、私のコンピューターでのます。

最適化するのにもっと役立つものが見つかります。


私のコード:

<?php

$start = time();
$var = null;

for ($i = 1000000; $i--; ) {
    is_null($var);
}

echo time() - $start;

$start = time();

for ($i = 1000000; $i--; ) {
    $var === null;
}

echo time() - $start;

1
興味深いことに、PHP / 7はこれに対処しているようで、パフォーマンスはほぼ同じになりました。実際、is_null()7.1.9Win32より下の私のコンピューターではわずかに高速です。
アルバロゴンサレス

@ÁlvaroGonzález私も同じことに気づきました。2つの機能の違いはごくわずかです。(is_null:0.54486592610677、=== null:0.7440135592506)10,000回の操作で。テストは30回実行され、これらの数値は平均です。
ジャスティンE


0

is_null($var)$var===null... 37.8ミリ秒対2.6ミリ秒よりも約14倍遅いです。

しかし、実際には理由はわかりません。


0

この議論で人々がしばしば言及することを忘れていることの1つは、厳密な型チェックがすべてである場合is_null、比較演算子(== vs ===)でタイプミスをしないようにするのに役立つということです。

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