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