PHPのissetとis_null、emptyの違いや関係を調べてみる

PHPには変数の値などを調べる関数としてissetis_nullemptyなどがあるが、これらがどのような挙動をしているか、どのような違いがあるか調べてみた。

また、これらの挙動の一覧をみたい場合は、「 PHPのisset,empty,is_null - モトクロスとプログラムと粉砕骨折と」の記事が非常によくまとまっていた。

issetとis_nullの違い

issetは、変数がnullでなければtrueを返し、それ以外はfalseを返す。逆にis_nullは変数がnullの場合にtrueを返す。

つまり、これらの関数はあくまでも「変数がnullかどうか」だけをチェックするので、isset$var = ''0$var = []でもtrueとなるし、逆にis_nullはfalseとなる。

emptyの動き

以下は、それぞれの関数の動きを詳しく見ていく。まずは、emptyから。

empty()は、「変数が空の場合にtrueを返し、それ以外はfalseを返す」と言う関数。

例えば、空文字の変数の場合は、empty($var)でtrueが返される。

<?php
$var = '';
if(empty($var)){
echo "yes!"; // yes!と表示
} else {
echo 'No..';
}

emptyでtrueを返すのは、以下の通り。

  • "" (空文字列)
  • 0 (整数 の 0)
  • 0.0 (浮動小数点数の 0)
  • "0" (文字列 の 0)
  • NULL
  • FALSE
  • array() (空の配列)

一方、プロパティがないオブジェクトの場合は、trueを返す。

また、PHP5.5以下のバージョンではemptyは変数のみ引数として受け付けており、empty(ltrim($var))のように扱うことができない。(PHP5.5以上だとできる)

参考:PHP: empty - Manual

issetの動き

issetは、変数がNULLかどうかだけをチェックする関数。例えば、$var;とか$var = NULLの状態だとisset()はfalseを返し、他の変数ではtrueを返す

なので、isset()は、以下のようにfalseが格納された変数でもtrueを返す

<?php
$var = false;
if(isset($var)){
echo "yes!";
} else {
echo 'No..';
}

参考:PHP: isset - Manual

is_nullの動き

is_null()は先ほどのissetの逆バージョン。変数がnullの場合はtrueを返す。

「別にis_null()ではなくて、$var === NULLとかいて良くない?」と思ったが、正直どちらでも良い。ただ、コールバック関数を使う場合はis_nullを使うべきだし、関数のオーバーヘッドを気にするのであれば、===NULLが良い(オーバーヘッド気にするなら、PHPを使うなとも言える)

参考:isnull - is_null($x) vs $x === null in PHP - Stack Overflow

参考:PHP: is_null - Manual