[勘違いしやすい?]PHP isset, if($var), empty, is_nullの判定違い

PHPの変数の空値の判定の違いを説明

PHPのissetって明示的で分かりやすいのですよね。

よく条件分岐で値が入ってるかどうかの判定で使うのですが、空の値の判定でめっちゃ勘違いしていました。

今回、リファレンスを参考にしながら実際自分でも1つ1つ動作確認してみました。

こちらでちょっと間違いやすい
isset
if($var)
!empty
!is_null
の判定の違いをまとめてみました!

判定の早見表

急ぎで情報がほしい方のために、先に結果を書いておきます。

isset if ($var) !empty !is_null
“” (空文字) TRUE FALSE FALSE TRUE
0 / 0.0
(数値のゼロ)
TRUE FALSE FALSE TRUE
“0”
(文字列のゼロ)
TRUE FALSE FALSE TRUE
[] / array()
(空の配列)
TRUE FALSE FALSE TRUE
false ( 偽値) TRUE FALSE FALSE TRUE
null FALSE FALSE FALSE FALSE
未定義の変数 FALSE Notice: Undefined variable FALSE Notice: Undefined variable

判定方法

$var = それぞれの空値 //未定義の場合は無し

if (それぞれの判定方法) {
echo 'TRUEだよ!'; //TRUEのときに表示
} else {
echo 'FALSEだよ!'; //FALSEのときに表示
}

勘違いしていたこと

issetという言葉のイメージから空文字の””と空配列array()はてっきりfalse扱いかと思っていました。

変数の値がセットされているかどうかではなく、変数自体がセットされているかということなんですね。

初期化式が書かれたまま、処理されずに判定される可能性がある場合は !emptyの方がいいですね。

それぞれの特徴

isset

  • issetは関数ではなく文書構造なので関数より速い
  • 変数が未定義でもエラーを出さずにnullの確認ができる 逆に言えば未定義とnullを区別できない
  • 複数の変数のチェックができる
  • 字面てきに分かりやすい

if ($var)

  • if ($var)だけだといろいろ探すのでパフォーマンスが悪い(is_nullよりは速い)
  • 空値はすべてfalseになる
  • nullかどうかだけ判定する場合はif ($var !== null)にするとこれらの中でいちばん速くなる
  • 未定義の変数はエラーを出す

!empty

  • emptyは関数ではなく文書構造なので関数より速い
  • 空値はすべてfalseになる
  • 変数が未定義でもエラーを出さずにnullの確認ができる 逆に言えば未定義とnullを区別できない
  • 否定の!が付くと字面てきに脳がつかれる(個人的感想)

!is_null

  • is_nullは関数なのでこれらの中ではいちばんパフォーマンスが悪い
  • if ($var !== null)が全然速いので使い所がない
  • 未定義の変数はエラーを出す

まとめ

それぞれの空値に対しての判定の違いをまとめてみました。

こうやって一覧にするといろいろ発見があり奥が深いですねー。

判定する変数にどのような種類の値が入ってくるのか、未定義になる可能性があるのか、遅くないか、分かりやすいか、といろんな要素を考慮してベストな方法を決めていくのが大事ですね!

もしnullや空文字の調べ方があいまいになってしまったら、こちらの記事を見直してみてください!