PHP isset is_null emptyについて

# 概要

- PHPの`isset()`や`is_null()`や`empty()`について曖昧だったので自分のためにまとめる。（この手の記事は先人の皆さんがたくさん記載頂いているが自分の勉強のためにも自力でまとめてみる。）

# `isset()`

- PHPのドキュメントには下記のように記載されている。

    ::: note info
    変数が宣言されていること、そして null とは異なることを検査する

- その変数が宣言されていて、かつ、nullではない場合trueを返す。それ以外の場合falseを返す。
- 複数の引数が渡された時、全て「その変数が宣言されていて、かつ、nullではない場合」のみtrueを返す。
- また、ドキュメントには下記のように記載されており、`isset()`は関数ではなく言語構造（`if`や`for`とかと同じでPHPにもとから組み込まれている処理）である。

    ::: note warn
    これは、関数ではなく 言語構造のため、可変関数 や 名前付き引数 を用いてコールすることはできません。

- 例を下記に記載する。

    ```php
    <?php
    
    var_dump(isset($foo)); // $fooが定義されていない時 false
    
    $foo = null;
    var_dump(isset($foo)); // $fooが定義されているがnullが格納されている時 false
    
    $foo = 'aaa';
    var_dump(isset($foo)); // $fooが定義されていてnull以外が格納されている時 true
    
    $foo = 'aaa';
    var_dump(isset($foo, $var)); // 複数の引数のいずれかが、定義されていない時 false

    $foo = 'aaa';
    $var = null;
    var_dump(isset($foo, $var)); // 複数の引数のいずれかが、定義されているがnullが格納されている時 false
    
    $foo = 'aaa';
    $var = 'bbb';
    var_dump(isset($foo, $var)); // 複数の引数が定義されていてnull以外が格納されている時 false
    ```

# `is_null()`

- PHPのドキュメントには下記のように記載されている。

    ::: note info
    変数が null かどうか調べる.

- チェックする変数はあくまで定義済であることが前提となる。
- すなわち「この変数、絶対定義されているけど中身がnullかどうか調べたい〜！」というときに使う。
- 例を下記に記載する。

    ```php
    <?php

    var_dump(is_null($foo)); // $fooが定義されていない時 error

    $foo = null;
    var_dump(is_null($foo)); // $fooが定義されているがnullの時 true
    
    $foo = 'aaa';
    var_dump(is_null($foo)); // $fooが定義されていてnull以外の時 false
    
    $foo = 'aaa';
    var_dump(is_null($foo, $var)); // 複数の引数は受け取れないためerror
    
    $foo = 'aaa';
    $var = 'bbb';
    var_dump(is_null($foo, $var)); // 複数の引数は受け取れないためerror
    ```

# `empty()`

- PHPのドキュメントには下記のように記載されている。

    ::: note info
    変数が空であるかどうかを検査する

- また、「変数が空」とみなされるのは下記の状態となる。

    ::: note info
    変数が存在しない場合や 変数の値が false に等しい場合です。

- 更に注意が必要なのは`empty()`は引数の変数が未定義の場合であってもエラーが出ない。

    ::: note warn
    empty() は、変数が存在しない場合でも警告を発しません。

- さらにbool値のfalseと判断される値が渡された時trueを返す。
    - [falseとして扱われる値](https://www.php.net/manual/ja/language.types.boolean.php#language.types.boolean.casting)
- 例を下記に記載する。

    ```php
    <?php
    
    var_dump(empty($foo)); // $fooが定義されていない時 true

    $foo = false;
    var_dump(empty($foo)); // $fooが定義されているがfalseが格納されている時 true    
    
    $foo = 0;
    var_dump(empty($foo)); // $fooが定義されているが0が格納されている時 true

    $foo = 0.0;
    var_dump(empty($foo)); // $fooが定義されているが0.0が格納されている時 true

    $foo = -0.0;
    var_dump(empty($foo)); // $fooが定義されているが-0.0が格納されている時 true

    $foo = '0';
    var_dump(empty($foo)); // $fooが定義されているが文字列の0が格納されている時 true

    $foo = '';
    var_dump(empty($foo)); // $fooが定義されているが空文字が格納されている時 true
    
    $foo = [];
    var_dump(empty($foo)); // $fooが定義されているが空配列が格納されている時 true

    $foo = null;
    var_dump(empty($foo)); // $fooが定義されているがnullが格納されている時 true
    
    $foo = 'aaa';
    var_dump(empty($foo)); // $fooが定義されていてnull以外が格納されている時 false
    
    $foo = true;
    var_dump(empty($foo)); // $fooが定義されていてtrueが格納されている時 false
    
    $foo = 'aaa';
    var_dump(is_null($foo, $var)); // 複数の引数は受け取れないためerror
    
    $foo = 'aaa';
    $var = 'bbb';
    var_dump(is_null($foo, $var)); // 複数の引数は受け取れないためerror
    ```

# まとめ

#### `isset()`

- 「当該の変数が定義済」and「nullではない」場合のみtrueを返す。
- 複数の引数を渡すことができ、すべての引数において上記条件を満たしていた場合trueを返す。
- 組み込み関数ではなく言語構造であるので動作が多少早い。
- 1個以上の引数を取ることはできない。
- 「変数が定義されているのか」と「nullではないか」をチェックしたい時に使う。

### `is_null()`

- 「当該の変数がnullである」場合のみtrueを返す。
- 当該の変数が定義されていない場合はエラーになる。
- 「確実に変数が定義されていて、nullであるか」をチェックしたいときに使う。

### `empty()`

- 「当該の変数が未定義」or「falseとして扱われる値」の場合trueを返す。
- 当該の変数が未定義でもtrueを返す。
- 1個以上の引数を取ることはできない。
- 「当該の変数の値がfalseとして扱われる値であるか」をチェックしたいときに使う。
- 重ねての記載だが、下記だけ注意

    ::: note warn
    empty() は、変数が存在しない場合でも警告を発しません。

# 参考文献

https://www.php.net/manual/ja/function.isset.php

https://www.php.net/manual/ja/function.is-null.php

https://www.php.net/manual/ja/function.empty.php