開発において、バリデーションチェックはとても大切です。isset, empty, is_null, ==null, ===nullなど、空チェックを完全に理解して開発ができていますか。今回は、確認のため、記載しておきたいと思います。
確認する対象
確認する関数
チェックしていく対象は、phpの空、0、false、null、未定義です。
比較するのは、以下の5つです。
・isset()
・empty()
・is_null
・== null
・=== null
たまに、ごちゃごちゃになってしまうことがあると思いますので、整理しておきます。
検証内容
$hoge という変数を、下記の9パターンの状態にして、チェックしていきます。
・宣言無し
・初期値の定義無し($hoge;)
・0
・””
・false
・null
・”0”
・array()
・array(“”)
検証
宣言無しの場合
isset() のケースがfalseで、それ以外の場合はtrueになりました。宣言がされていない場合では、empty()はtrueになり、is_nullなどのnull判定は全てtrueになります。
ただ、noticeエラーが出る点は要注意です。画像に記載されている通り、PHPで Notice: Undefined variable: というエラーが出力されています。これは、変数に値がないというエラーになります。
初期値の定義無し($hoge;)の場合
こちらのケースでは宣言はしますが、初期値をセットしないケースです。先ほどの宣言無しの場合と同様に、isset() のケースがfalseで、それ以外の場合はtrueになりました。ここでも、変数に値が入っていないため、PHPでNotice: Undefined variable: というエラーが出力されています。
0の場合
今度は、変数に0をセットしてみました。注意点としては、emptyがtrueという扱いをします。empty()は、0(整数)や”0″(文字列の0)を空と判定するので、注意が必要です。また、is_null も == と === で挙動が違います。型まで見ているかが大きな違いなのですが、気をつけるようにしましょう。
https://www.php.net/manual/ja/language.types.null.php
ここにも記載がありました。
””の場合
空文字の場合、is_null と === null は型まで厳密に見ているので、nullではないと判断し、falseを返しています。それ以外は、trueになっています。
falseの場合
falseの場合、先ほどの空文字と同様に、is_null と === null は型まで厳密に見ているので、nullではないと判断し、falseを返しています。一方で、emptyの場合は、空だと判定されて、trueと返すので注意が必要です。
nullの場合
is_null, == null, === null の場合は、nullがセットされていた場合、trueで返却されています。emptyのケースだと、trueと判定されますので、気をつけてください。
”0”の場合
文字列での “0” の場合です。is_null, == null, === null の場合は、nullではなく文字列がセットされているとみなされますので、falseになります。一方で、このケースでもemptyは、trueと返されます。
array()の場合
空配列の場合です。この場合は、is_null と === null は型まで厳密に見ているので、nullではないと判断し、falseを返していますが、それ以外のケースでは、trueを返しています。
array(“”)の場合
最後に、array(“”)の場合です。これは、配列に空文字が入っている扱いになりますので、issetはtrueになり、それ以外のケースでは、emptyでもなく、nullでもないため、全て結果がfalseになっています。
結果
結果をまとめました。表にまとめています。
ポイント
isset()で気にすること
変数にセットされた値を見るようにしています。変数にセットされている値が何かというより、変数に値がセットされているかを判定しているので、その点を抑えておくようにしましょう。
is_null, == null, === null の挙動について
is_null と === null は、型まで厳密に見ているので、結果は同じになりますが、== null は型まで見ていないため、結果が異なります。null かどうかを確認したいときは、is_null か === null を使うようにしましょう。
emptyはあいまい判断をするので要注意
empty は理解して使わないと、思わぬバグを生む原因になりますので、注意してください。先ほどの例にもありましたが、空文字や 0 の場合など、empty() は多くのパターンで true を返します。判定基準が緩い関数のため、できれば、emptyを使わずに厳密に判定できる関数を使うべきです。
ちなみに、empty() や isset() には未定義の変数に対して使ったとしても、Notice: Undefined variable: のようなエラーが出力されない特別な性質があり、変数名のタイプミスに気がつけなくなってしまいます。
$person = array('taro', 'ichiro');
if (empty($perso)) {
echo 'これは空配列です';
}
上記のコードを実行すると、’これは空配列です’ と出力されます。先ほど記載した、未定義の変数に対して使ったとしてもエラーが出力されないケースに当てはまっており、$perso と nが抜けていたとしても気付くことができません。
そのため、emptyを使いたい理由がなければ、無理に使わずに避けることをおすすめします。