はじめに
実務で「変数に配列がセットされてるけど、空配列であることを判定」する必要がありました。
PHPでは配列の空判定が出来る関数としてisset, empty, is_nullがありますが、違いがよくわからずに苦労しました。
理解を深めるために違いをまとめたので記事にしました!
対象者
この記事は下記のような人を対象にしています。
- 駆け出しエンジニア
- プログラミング初学者
- null?空文字?なにそれ美味しいの?な人
- isset, empty, is_null...聞いたことあるけど、全部同じじゃないの?と思ってる人
PHPのnull判定関数(isset, empty, is_null)の違い早見表
まずは結論から。
値 | if($var) | isset | empty | is_null | |
---|---|---|---|---|---|
1 | $var=1 | true | true | false | false |
2 | $var=""; | false | true | true | false |
3 | $var="0"; | false | true | true | false |
4 | $var=0; | false | true | true | false |
5 | $var=NULL; | false | false | true | true |
6 | $var | false | false | true | true |
7 | $var=array() | false | true | true | false |
8 | $var=array(1) | true | true | false | false |
以下、それぞれについて解説します。
PHPのisset関数
変数が宣言されていること、そして null とは異なることを検査する
公式ドキュメントより
「変数が宣言されていること」がempty, is_nullと違う点なので注意です。
表5のケースでは変数$varにnullがセットされているのでfalse。
表6のケースでは変数$varは宣言されているものの、値はセットされていないのでfalse。
それ以外のケースでは、空文字/数字の0/空の配列だろうと、nullでないものがセットされてるのでtrueです。
PHPのempty関数
変数が空であるかどうかを検査する
公式ドキュメントより
PHPのempty関数は「空であるかどうか」を判定します。
空文字/数字の0/文字列の0/null/空の配列などがtrueになります。
PHPのis_null関数
変数が null かどうか調べる
公式ドキュメントより
名前の通り、null/何もセットされていない場合にtrueになります。
と、いうことはissetと!is_nullは一緒やんな?→違います
ぱっと見、issetとis_nullは正反対の判定をしているように見えます。
ということはissetと!is_nullどっち使ってもいいはず...と思ったあなた、ダウトです。
issetは「変数が宣言されていること」も判定していますが、is_nullは関係ありません。
$x = 'test';
var_dump(isset($y));
// 結果(変数$yは宣言されていないのでfalse)
bool(false)
$x = 'test';
var_dump(!is_null($y));
// 結果(そもそも$yが宣言されていないのでundefined)
PHP Notice: Undefined variable: y in test.php on line 7
おわりに
PHPのnull判定関数(isset, empty, is_null)の違いについてまとめました。
特にissetと!is_nullは素人目には同じように思えましたが、きちんと調べると挙動が違うことが理解できました。