empty()とisset()の違いを理解する
ログイン画面を作る際にempty()とisset()を使っている場面があり、両者の違いについて調べた結果をまとめてみました。
両者の簡単な特徴と、実際にどのような違いが出るのか試したコードも下記に記載しております。
emptyが意味する内容とsetが意味する内容を理解するのも大切ですが、文字とtrue&falseの関係についての理解が不可欠だと思います。
1, empty()とはなんぞや
PHPのドキュメントを借りると”変数が空かどうかを判断する”と説明されていますが、まず空ってどういう状況かについて理解する必要があります。
空というのはその変数が存在しない、もしくは変数の値がfalseと等しい(0など)場合のことを意味します。
empty()は一つのパラメータしか設定できないのに比べて、isset()は複数のパラメーターを設定できる点は一つの大きな違いになります。
2, isset()とはなんぞや
isset()は変数がすでに宣言されている、かつ値がnullでない場合にtrueを返します。
iseset()は複数のパラメーターを設定することができます。その場合は全ての変数が上記の条件を満たした時にtrueを返します。
3, empty(), isset()の具体例を見てみる
実際にempty()とisset()の返り値の違いについて同じ変数を用いて比べてみました。
i) 変数の値が0の場合
$var = 0;
//print()が実行される
if (empty($var)) {
print("empty return true for 0," . "\n");
}
//print()が実行される
if (isset($var)) {
print('isset return true for 0');
}
0はfalseと同義として扱われるため、empty()の返り値はtrueになります。
$varは宣言されており、かつnullではないためisset()の返り値もtrueになります。
ii) 変数の値が""の場合
$var2 = "";
//print()が実行される
if (empty($var2)) {
print('empty return true for "" ');
}
//print()が実行される
if (isset($var2)) {
print('isset return true for ""');
}
''"は0と同じくfalseとして扱われるため、empty()の返り値はtrueになります。
またi)と同じ理由から、isset()の返り値もtrueになります。
iii) 変数の値が" "の場合(""の間にスペースがある場合)
$var2nd = " ";
//print()が実行されない
if (empty($var2nd)) {
print('empty return true for " "');
}
//print()が実行される
if (isset($var2)) {
print('isset return true for " "');
}
""の間にスペースがあるため、empty()はfalseを返します。
よってprint('empty return true for " " ')は実行されません。
isset()は””のスペースの有無は影響を受けないのでii)と同じくtrueを返します。
iv) 変数の値がnullの場合
$var3 = null;
//print()が実行される
if (empty($var3)) {
print("empty return true for null");
}
//print()が実行されない
if (isset($var3)) {
print('isset return true for null');
}
nullはisset()がfalseを返す条件の一つであるため、empty()のみtrueを返します。
v) 変数の宣言のみした場合
$var4;
//print()が実行される
if(empty($var4)) {
print("empty return true for unset variable");
}
//print()が実行されない
if(isset($var4)) {
print("isset return true for unset variable");
}
宣言のみの場合、その変数は値を持たないためnullとして扱われます。
よってempty()のみtrueを返します。
vi)変数の値に文字列を指定した場合
$var5 = "test";
//print()は実行されない
if(empty($var5)) {
print("empty return true for set variable");
}
//print()が実行される
if(isset($var5)) {
print("isset return true for set variable");
}
ようやく普段使うような変数の例が出てきました。。。
変数の値がfalseでもnullでもない→isset()のみtrueを返します。
まとめ
empty()とisset()の特徴自体はそこまで難しくなく、falseと同義の文字列やnullの定義に関しての理解を深めることの方が重要でした。
PHPのドキュメントを見るだけでなく、実際にいくつかのパターンを自分で試すことで理解が深まると思います。
今回上げた例や、ご自身で思いついた例などを試してみてください。
*グローバル変数を用いたパターンに関しては別途まとめたいと思います。
(一度試した際に$_SESSIONが他のグローバル変数と異なる挙動をしたため、グローバル変数自体のさらなる調査が必要になり、内容量が膨大になりそうなためここでは割愛させていただきました。)