PHPで変数にデータがあるかどうかのチェック方法はいくつかあります。しかし、方法によって結果が異なるので混乱しがちなので整理します。
変数にデータがあるかのチェック方法
PHPで変数をチェックする方法はいくつかあります。
empty()関数を使うと、その変数はデータが空かどうかの結果を返します。
ただ、empty()関数は変数に文字列”0″や数値の0が格納されていたとしても、trueを返します。
つまり文字列”0″と数値の0はデータが格納されていないのと同じことになります。
そして似た機能のis_null()関数というがあります。
これは変数がNULLかどうかの結果を返します。
is_null()関数は文字列”0″や数値の0は、falseを返すのでempty()関数と違う判断ができます。
ただ、変数を空にするつもりで文字列になにも指定しない””という入力をした場合、falseを返します。
これはempty()関数ではtrueを返すので、empty()関数と同じ動きをすると思って使うと結果を間違ってしまいます。
empty()関数やis_null()関数とは反対に、isset()関数があります。
これは変数にデータが格納されているかどうかの結果を返します。
データが格納されていればtrue、格納されていなければfalseを返し、文字列”0″や数値0もtrueを返すので期待通り動作するように思います。
ただこれも、変数を空にするつもりで文字列になにも指定しない””という入力をした場合、trueを返します。
つまり変数にデータが格納されているという判断となります。
PHPで変数をチェックする関数は3種類、empty()、is_null()、isset()がありますが、どれを使ったときでも期待通りではないポイントがあるので注意が必要です。
また、関数を使わずに直接変数を条件式で使うことでチェックすることもできます。
if ($x)というふうに変数を条件式で直接評価することでチェックできます。
この方法だと期待通り動きそうなのですが、これも文字列”0″をfalseを返すので、文字列”0″が格納されているのに空である判断となってしまいます。
変数をチェックするときのポイント
empty()関数を使うときは、文字列”0″や数値0は変数には何も格納されていないのと同等であることを前提としてコーディングする必要があります。
isset()関数では、変数がNULL、定義したけど何も格納されていない、変数が未定義のときはfalseを返しますが、変数に何も指定しない文字列””が格納されているときもfalseを返すので、これを注意してコーディングする必要があります。
is_null()関数はisset()関数の真逆の結果を返します。
注意点はisset()関数と同じく変数に何も指定しない文字列””が格納されているときに、trueを返すので注意してコーディングする必要があります。
変数を条件式で直接評価する方法if($x)は、empty()関数と真逆の結果を返します。
注意点は文字列”0″は何も格納されていないのと同等であることを前提としてコーディングする必要があります。
empty()関数と結果への期待として違う点として、数値0がfalseで結果を返すことです。
if($x)で評価するときは数値0はfalseで期待通りの結果と考える人も多いと思います。
まとめ
以上がPHPで変数をチェックする方法となります。
複数の方法があるのですこし混沌としているように見えると思います。
以下は公式サイトにある比較表を取り上げたものなので参考にしてください。
式 | empty() | is_null() | isset() | if($x) |
$x = “”; | TRUE | FALSE | TRUE | FALSE |
$x = null; | TRUE | TRUE | FALSE | FALSE |
var $x; | TRUE | TRUE | FALSE | FALSE |
$x が未定義 | TRUE | TRUE | FALSE | FALSE |
$x = array(); | TRUE | FALSE | TRUE | FALSE |
$x = array(‘a’, ‘b’); | FALSE | FALSE | TRUE | TRUE |
$x = false; | TRUE | FALSE | TRUE | FALSE |
$x = true; | FALSE | FALSE | TRUE | TRUE |
$x = 1; | FALSE | FALSE | TRUE | TRUE |
$x = 0; | TRUE | FALSE | TRUE | FALSE |
$x = “1”; | FALSE | FALSE | TRUE | TRUE |
$x = “0”; | TRUE | FALSE | TRUE | FALSE |
公式サイト:https://www.php.net/manual/ja/types.comparisons.php