エンジニアのひよこ_level10

毎日更新してた人。たまに記事書きます。

【PHP】変数未定義と配列の未定義の違いの考察【654日目】

注意

根拠のない個人的考えです!ようするにポエムです!

こういう理由があるんだよ!って意見があれば、ぜひ教えていただけると嬉しいです。

issetで疑問に思った

PHPには、issetという関数が存在します。

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

変数がセットされていること、そして NULL でないことを検査する

この説明から、ふと疑問に思いました。

変数がセットされてるかだけのチェックをする関数ってないのかな?

$x = null;

xxx($x); // true
xxx($y); // false

こんな状態。今だと、以下のような書き方すれば実現しますが、

isset($x) || $x === null

empty関数や、is_null関数とかいろいろあるけど、未定義だけを判定する関数なんで存在しないんだろう?

配列とかにはある

ちなみに、配列で特定のキーがあるかとか、オブジェクトに該当の値があるかとかを確かめる関数は存在します。

■array_key_exists

https://www.php.net/manual/ja/function.array-key-exists.php

■property_exists

https://www.php.net/manual/ja/function.property-exists.php

なら変数にもあってもおかしくないはず・・・?

実際のケースを考える

この疑問で思った最初のケースを考え直してみよう。

最初はユーザーからくるリクエストを想定していて、該当する配列に値がない場合とかを指していた。

array_key_exists('hoge', $_REQUEST);

なるほど、配列では必要そう。

単体の変数が未定義のケースはあるのか!?

では、変数が未定義の場合って?

・・・あれ?ほとんどなくないか?

ユーザーからの値が未定義などは、自分のコードの関心の外であり、コーダーが把握することは不可能。DBの状態なんてその時によって違うし。
でも、こういった値は、配列の中身が未定義であって、値が未定義であるケースは、たしかに思い浮かばない。

変数が未定義のコード

変数が未定義と定義がの両方の状態が現れるコードは、以下のようなコード。

if ($request == true) {
    $var = 3;
}

var_dump($var);

でも、これは以下のように書き換えることも出来る。

$var = null;

if ($request == true) {
    $var = 3;
}

var_dump($var);

『絶対に未定義であるかを判定する必要がある』コードってなかなかないのでは?

変数が未定義なのは、コーダーの事情だし、どちらかというとコードの書き方のミスなのではないかφ(・

『必須の関数か』と考えるとそうではないのかもしれない。
長いことPHPが発展してきても、該当関数が生まれなかったのは、こういった理由なのかもしれない。

個人的な結論

変数の未定義と、配列のキー内での未定義は、意味・用途が違う。

該当関数が存在しないのは、『不要』だからではないか。

感想。

変数の未定義と、配列のキー内での未定義は、明確に違うのがわかった。

もしかすると、過去のPHPのアップデートで、同じ思いで未定義を判定する関数ほしいって意見があったけど、却下とかされていたかもしれないφ(・

なんにしても、『意味が違う』と、『なんでこの関数が存在するのか』という視点が得られたのは、良い学びだったと思います!

みなさんも、関数の意味や、なぜ存在するのかを考えてみると、面白いかもしれません(`・ω・´)ゞ