PHPでプログラムを書くときに、
空の配列ってemptyでよかったっけ?
issetってこの処理だとtrueを返すのか?
など、ちょっとした条件文につまづくことがあるなあと感じています。
調べればすぐに出てくるのですが、今回は一覧表とよく使うケースをまとめてみます。
is_null, empty, issetの一覧表
値 | is_null | empty | isset | if |
---|---|---|---|---|
$var; | true | true | false | false |
$var = 1; | false | false | true | true |
$var = ”; | false | true | true | false |
$var = null; | true | true | false | false |
$var = []; | false | true | true | false |
$var = [0]; | false | false | true | true |
これでスッキリしましたね。
is_null, empty, issetのよく使うケース
書き方はある程度これでわかったのですが、その中でもやはり使用するケースが多いものと正直あまり使用しないケースがあるものです。
個人的にはemptyはよく使いますが、issetなんかはあまり使いません。といった感じでよく使うケースをまとめてみました。
この辺りはコーディング規約も様々かなと思うので、あくまでも一つの考え方として見てもらえればいいと思います。
配列が空かどうかはemptyで判定する
配列が空であるかどうかはemptyで判定します。上記のように配列が空かどうかを判定するのはifでもできます。
ただ、emptyを使ったほうが、後で読み直したときに明示的に配列であるか判定していることがわかりやすいためです。
おそらくこの中ではトップクラスに使用する関数かなと思います。
is_nullとissetは使わない
ケースバイケースだとは思いますが、僕はあまりis_nullとissetは使いません。
理由としては、issetとis_nullは真逆の関係にあるため、使用するとしたらどちらか一方で十分という考え方のためです。
であれば、読んだほうが直感的にわかりやすいようにするためにもis_null(isset)で統一するといいかなと思います。
僕は使うとすればis_nullを使いますが、is_nullもPHP7から追加されたnull合体演算子を使うことによって、使用するケースを大幅に減らすことができます。
is_nullではなくnull合体演算子を使う
null合体演算子とは、PHP7から追加された渡された値がnullであるかどうかを判定してくれる関数です。
書き方は「??」で変数がnullであるかどうかの判定を行います。
例えば、
$var = null;
$result = $var ?? 0;
var_dump($result);
int(0)
というように、$varがnullであるかを判定してくれます。
$varがnullでない場合はその変数が値に入ります。
$var = 0;
$result = $var ?? 1;
var_dump($result);
int(0)
これを使えばis_nullやissetを使うケースも少なくなりそうですよね。
null合体演算子の便利な使い方
null合体演算子の便利なところは、複数の演算子をつなげて使用することができるという点です。
先程は演算子を一つ使っただけですが、これを複数つなげることによって「AがnullであればBを代入、さらにBがnullであればCを代入する」ということができます。
具体的に書いてみると、
$a = null;
$b = null;
$c = 0;
$result = $a ?? $b ?? $c;
var_dump($result);
int(0)
可読性の問題もあるので、あまりにも繋げるのはどうか?と思いますが、こういう書き方もあるということを知っておいて損はないでしょう。
おまけ:条件分岐を1行で書ける三項演算子(エルビス演算子)
別名エルビス演算子とも呼ばれますが、三項演算子という書き方もあります。
プログラムを書いていれば、下記のような記述はよく見るパターンでしょう。
if($a) {
$result = $b;
} else {
$result = $c;
}
このように$aを条件とした条件分岐が三項演算子を使えば、わずか1行で書けてしまいます。
$result = $a ? $b : $c;
$aを評価してtrueであれば、$result=$bとなり$aがfalseであれば、$result=$cとなります。
少々慣れるまでには時間がかかりますが、書き方を覚えてしまえば非常に便利な書き方と言えるでしょう。
とはいえ、三項演算子?:は悪である。という記事もあるように、複雑な処理をする際には可読性が大きく損なわれるという問題もあるため、使うには賛否両論あるみたいです。
個人的には、三項演算子を使うのであれば複雑なケースでは書かずに上記のようなシンプルなケースでのみなら使うのも全然ありだと思っています。
もし、上記の$cには処理が入るのであれば、下記のように別メソッドに分けるなどして記述をシンプルにすることを心がければよいかなと思っています。
$result = $a ? $b : func();
func() {
// ...何かの処理
return $c;
}
せっかく便利なメソッドがあるので、こういった使い分けをしていきたいですね!