Skip to content

isset と empty について

2021-03-26


PHP にはクソみたいな混同しがちなクソみたいな組み込み関数がたくさんあります。isset と empty も例外ではありません。
こいつらの違いや挙動、使い分け、また周辺の関数への理解が PHP 歴1ヶ月の僕には難しかったのでとりあえず書いて覚えるみたいなことをします。

isset

まず isset について。

変数がセットされているかを調べます。 これは変数が宣言されており、 null とは異なる値だということです。

らしい、とても良いと思います。
PHP はエラーレベルを指定できるため、undefined でもエラーを吐かないことも可能なのですがどうせテストで引っかかるのでここで変数チェックをすることでそのエラーを避けることができます。

$name = 'takurinton';
if (isset($name)) {
    echo 'hi I am ' . $name;
}
1
2
3
4

こんな感じで使えます。$name が undefined だったら何も出力されません。

empty

empty についてです。

変数が空であるかどうかを検査します

らしい。つまり定義だけして代入してなかったら false が返ってくるみたいな感じです。

てことは、クラスの中でフィールドに初期値を定義してそれをコンストラクタで初期値代入できているかどうかのチェックをするときとかに使えそう?

class SimpleClass
{
    private $var;
    
    function __construct(string $name) {
        $this->var = $name;
    }

    public function myFunc() {
        if (empty($this->var)) {
            echo 'variable is empty';
        }
        echo $this->var;
    }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15

まあこんな書き方しないけどパッと思いつくのがこれしかなかった。

これの何がクソなのか

これ適切に管理しないとクソコードが完成するので非常に体験が悪くなります。コード規約とか作った方がいい。
結局は PHP がクソってよりは自分がクソって話なのですが、例えば自分が見たコードではこんな感じのがありました。
(正直観測したコードがクソなだけってのはあるので突っ込まないで泣いちゃう)

$hoge = env('HOGE');
if (!isset($hoge)) {
    処理
}

$fuga = env('FUGA')
if (empty($fuga)) {
    処理
}
1
2
3
4
5
6
7
8
9

みたいな感じです。やってることはほぼ同じなのですが、どちらかに統一した方が絶対良いし、それぞれ意味が逆なので ! が発生してあまり嬉しくないです。
中身のコードを読む感じでもこの2つを使い分ける必要はなさそうで、どっちも isset にした方が良いのではないかなあとか思って見てました。

他にもあるぞこの類の関数

PHP ってこういう関数がゴロゴロあるんですよね。良くも悪くもな気がしてます。
多くのサポートが受けられるのはいいことだけどそれによって管理がしにくくなっては意味がないので。

gettype()empty()is_null()isset()bool: if($x)
$x = "";stringtruefalsetruefalse
$x = null;NULLtruetruefalsefalse
var $x;NULLtruetruefalsefalse
$x が未定義NULLtruetruefalsefalse
$x = array();arraytruefalsetruefalse
$x = array('a', 'b');arrayfalsefalsetruetrue
$x = false;booltruefalsetruefalse
$x = true;boolfalsefalsetruetrue
$x = 1;intfalsefalsetruetrue
$x = 42;intfalsefalsetruetrue
$x = 0;inttruefalsetruefalse
$x = -1;intfalsefalsetruetrue
$x = "1";stringfalsefalsetruetrue
$x = "0";stringtruefalsetruefalse
$x = "-1";stringfalsefalsetruetrue
$x = "php";stringfalsefalsetruetrue
$x = "true";stringfalsefalsetruetrue
$x = "false";stringfalsefalsetruetrue

上で紹介したやつ以外に is_null という関数や gettype という関数があります。
それぞれその名の通りだなという感じなので省略。ここら辺を適切に使用していけるようにしていきたいです。

まとめ

別に PHP を否定しているわけではなくて、管理を間違うと死ぬぞみたいな話。
令和時代のレガシーなコードは PHP で書かれていることが多く、保守運用やリファクタ、場合によってはリプレイスが必要になりますがそのような時に適切に処理を追うことができるようにそれぞれの関数の意味を適切に理解していきたいです。
また、これから新しく書くときも混同しづらい表現を使ったり必要ならコメントを書いたりして対処していきたいです。