PHPでとある変数がnullや空か、いわゆる存在チェックをしたい時、よくisset()
やempty()
をよく分からないまま使用していて不具合があったので、詳しく調べてみたときの備忘録です。
実際に自分で出力を確かめながら調べ直してみました。
比較するのは以下の5つ。
- isset()
- empty()
- is_null
- == null
- === null (2018/05/01に追加検証)
では、出力結果をまとめていきます。
各判定方法の実行結果
$hogeという変数を、下記の9パターンの状態にし、
- 宣言無し
- 初期値の定義なし
- 0
- ""
- false
- null
- "0"
- array()
- array(5) (legthの指定だけで中身は全て空)
それぞれの状態で以下を実行しました。
var_dump(isset($hoge));
var_dump(empty($hoge));
var_dump(is_null($hoge));
var_dump($hoge == null);
var_dump($hoge === null);
その結果を、表にまとめたものが以下です。
$hoge | isset() | empty() | is_null() | == null | === null |
---|---|---|---|---|---|
宣言なし | 0 | 1 | @1 | @1 | @1 |
初期値なし | 0 | 1 | @1 | @1 | @1 |
0 | 1 | 1 | 0 | 1 | 0 |
"" | 1 | 1 | 0 | 1 | 0 |
false | 1 | 1 | 0 | 1 | 0 |
null | 0 | 1 | 1 | 1 | 1 |
"0" | 1 | 1 | 0 | 0 | 0 |
array() | 1 | 1 | 0 | 1 | 0 |
array(5) | 1 | 0 | 0 | 1 |
0 |
1
:bool(true)
、0
:bool(false)
です。@
がついているものは、エラー制御演算子@
をつけない場合に「Undefined variableエラー」を吐き出したものです。
ややこしいポイント
isset()の挙動
変数の中身がどうというより、引数に渡された変数が「すでに初期化(セット)されたものかどうか」を判定するようです。
例えば変数が空文字 ""
や空の配列array()
だったとしても、空の値として初期化されているので、true
を返します。
初期化処理されていない変数に対するエラーの有無
is_null()
と== null
では、初期化処理されていない変数を使用するとデバッグモードでエラー文が出力されます。
逆に、isset()
やempty()
では出力されませんでした。
これは使い分けが重要になってきますね。
「is_null()」 と 「== null」の結果が結構違う
これは意外でした。どうしてここまで違うのか、細かい部分はまだ調べていないのですが、結果が全然違う、ということは頭に入れておきたいです。
追記(2018/05/01)
このメモの初回執筆時、==
と ===
の違いすらまだ知らない頃だったのでこの結果にけっこうびっくりしていたんですが、今回、追加で===null
の検証を行ったところ、is_null()
と全く同じになりました。
つまり、is_null()
の内部では ===
と同じく、型も含めたnull判定をしているということが分かりました。
おまけ:var_dumpの出力結果を直接見たい方はこちら
以下では、var_dump()
を実際に吐き出しています。
確実な結果を確かめたい方はぜひ自分の目でご確認ください。