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や空文字の調べ方があいまいになってしまったら、こちらの記事を見直してみてください!