PHPのissetとis_null、emptyの違いや関係を調べてみる
PHPには変数の値などを調べる関数としてissetやis_null、emptyなどがあるが、これらがどのような挙動をしているか、どのような違いがあるか調べてみた。
また、これらの挙動の一覧をみたい場合は、「 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以上だとできる)
issetの動き
issetは、変数がNULLかどうかだけをチェックする関数。例えば、$var;とか$var = NULLの状態だとisset()はfalseを返し、他の変数ではtrueを返す
なので、isset()は、以下のようにfalseが格納された変数でもtrueを返す
<?php
$var = false;
if(isset($var)){
echo "yes!";
} else {
echo 'No..';
}
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