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
  • 1bool(true)0bool(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()を実際に吐き出しています。

実際の検証時の出力結果を見る

確実な結果を確かめたい方はこちらでどうぞ。

- Thank you for reading. -

コメント

コメントする