PHPでの空値の扱い〜issetとemptyを比較する

PHPでは、NULLやundefinedや空文字(''のこと)や0や'0'が空値扱いされたりされなかったりする。

他の言語ではこれらを

Java
if (hoge == null || hoge.equals("")) {  // 空文字かどうか
    .....
if (hoge == 0) {  // 0かどうか
    .....
if (!hoge) {  // falseかどうか
    .....

と書いた場合は全て違うわけだが(その前にJavaの場合は変数の型が決まっているので、上記を全て満たすhogeは記述できないが)、PHPでは、これが記述できてしまう。更に、その時の条件による挙動があいまいに感じる。


そこで、PHPでは上記のような等号/不等号による判断をなるべく避けて、isset()/empty()を使うのが良いのではないだろうか。

  • isset() あるかどうか
  • empty() 無いかどうか

よって、比べるにはisset()と!empty()としなければならないが、これを比べる簡単なプログラムを書いてみた。結果は次のとおりである。

         : isset() : !empty()
                                                        • -
未定義 : FALSE : FALSE 一致  NULL : FALSE : FALSE 一致  FALSE : TRUE : FALSE 不一致 空文字 : TRUE : FALSE 不一致 空配列 : TRUE : FALSE 不一致 0 : TRUE : FALSE 不一致 '0' : TRUE : FALSE 不一致 '0a' : TRUE : TRUE 一致  unset後 : FALSE : FALSE 一致  $hoge_back=0a

最後の「$hoge_back=0a」は、下のプログラムを見ていただきたい。unset()で変数をクリアしても、実体は残っている、という確認だ。

この結果を見ると、isset()とempty()のそれぞれが何を見ているのかが分かってくる。

isset()では、変数が指す先がNULLかどうかを見ているようだ。変数の先(変数に直接格納された、実体としての値が格納された領域へのアドレス)が0(NULL)かどうかをチェックし、何らかの実体を指している場合はtrueが返却される。その際、指している実体が0かどうかは問題ではない。

empty()は、isset()で確認される、その変数が指している実体があり、かつ、その実体が「0」と扱われるかどうか、を判断しているようだ。

以下に、この結果を表示するための簡単なプログラムを示す。

<?php

echo '         : isset() : !empty()' . "\n";
echo '-----------------------------' . "\n";

echo '未定義   : ';
if (isset($hoge)) {
        echo ' TRUE ';
} else {
        echo ' FALSE';
}
echo '  : ';
if (!empty($hoge)) {
        echo ' TRUE  ';
} else {
        echo ' FALSE ';
}
if (isset($hoge) == (!empty($hoge))) {
        echo '  一致 ';
} else {
        echo '  不一致';
}
echo "\n";

echo 'NULL     : ';
$hoge = null;
if (isset($hoge)) {
        echo ' TRUE ';
} else {
        echo ' FALSE';
}
echo '  : ';
if (!empty($hoge)) {
        echo ' TRUE  ';
} else {
        echo ' FALSE ';
}
if (isset($hoge) == (!empty($hoge))) {
        echo '  一致 ';
} else {
        echo '  不一致';
}
echo "\n";

echo 'FALSE    : ';
$hoge = FALSE;
if (isset($hoge)) {
        echo ' TRUE ';
} else {
        echo ' FALSE';
}
echo '  : ';
if (!empty($hoge)) {
        echo ' TRUE  ';
} else {
        echo ' FALSE ';
}
if (isset($hoge) == (!empty($hoge))) {
        echo '  一致 ';
} else {
        echo '  不一致';
}
echo "\n";

echo '空文字   : ';
$hoge = '';
if (isset($hoge)) {
        echo ' TRUE ';
} else {
        echo ' FALSE';
}
echo '  : ';
if (!empty($hoge)) {
        echo ' TRUE  ';
} else {
        echo ' FALSE ';
}
if (isset($hoge) == (!empty($hoge))) {
        echo '  一致 ';
} else {
        echo '  不一致';
}
echo "\n";

echo '空配列   : ';
$hoge = array();
if (isset($hoge)) {
        echo ' TRUE ';
} else {
        echo ' FALSE';
}
echo '  : ';
if (!empty($hoge)) {
        echo ' TRUE  ';
} else {
        echo ' FALSE ';
}
if (isset($hoge) == (!empty($hoge))) {
        echo '  一致 ';
} else {
        echo '  不一致';
}
echo "\n";

echo '0        : ';
$hoge = 0;
if (isset($hoge)) {
        echo ' TRUE ';
} else {
        echo ' FALSE';
}
echo '  : ';
if (!empty($hoge)) {
        echo ' TRUE  ';
} else {
        echo ' FALSE ';
}
if (isset($hoge) == (!empty($hoge))) {
        echo '  一致 ';
} else {
        echo '  不一致';
}
echo "\n";

echo '\'0\'      : ';
$hoge = '0';
if (isset($hoge)) {
        echo ' TRUE ';
} else {
        echo ' FALSE';
}
echo '  : ';
if (!empty($hoge)) {
        echo ' TRUE  ';
} else {
        echo ' FALSE ';
}
if (isset($hoge) == (!empty($hoge))) {
        echo '  一致 ';
} else {
        echo '  不一致';
}
echo "\n";

echo '\'0a\'     : ';
$hoge = '0a';
if (isset($hoge)) {
        echo ' TRUE ';
} else {
        echo ' FALSE';
}
echo '  : ';
if (!empty($hoge)) {
        echo ' TRUE  ';
} else {
        echo ' FALSE ';
}
if (isset($hoge) == (!empty($hoge))) {
        echo '  一致 ';
} else {
        echo '  不一致';
}
echo "\n";

echo 'unset後  : ';
$hoge_back = $hoge;
unset($hoge);
if (isset($hoge)) {
        echo ' TRUE ';
} else {
        echo ' FALSE';
}
echo '  : ';
if (!empty($hoge)) {
        echo ' TRUE  ';
} else {
        echo ' FALSE ';
}
if (isset($hoge) == (!empty($hoge))) {
        echo '  一致 ';
} else {
        echo '  不一致';
}
echo "\n";

echo "\n" . '$hoge_back=' . $hoge_back . "\n";