今回は PHP を理解する中でもっとも難しいとされている isset() 関数や is_null() 関数や、false や NULL に対する == や === 演算子の結果についてまとめてみた。
何が難しいかって別に分かれば難しくないんだけど、はっきり言ってややこしすぎる。
俺はこの PHP の実装があまり好きじゃない。
でもとにかくこれは理解しておかないと、後々よく分からないバグではまったりするので一応まとめてみた。
この関数は引数の値に何らかの値がセットされているかどうかを判断して、 true/false を返す。
なので、一度でも触っていれば常に true を返すと思ったら大間違い。以下のテストプログラムと結果を見てみると。
echo "isset() test case --------------------------
"; echo "no define: " . (( isset($var) ) ? "true" : "false") . "<br />"; $var = NULL; echo "set NULL: " . (( isset($var) ) ? "true" : "false") . "<br />"; $var = 0; echo "set 0: " . (( isset($var) ) ? "true" : "false") . "<br />"; $var = false; echo "set false: " . (( isset($var) ) ? "true" : "false") . "<br />"; $var = ""; echo "set blank: " . (( isset($var) ) ? "true" : "false") . "<br />"; $var = array(); echo "set blank array: " . (( isset($var) ) ? "true" : "false") . "<br />"; unset($var); echo "unset: " . (( isset($var) ) ? "true" : "false") . "<br />";
isset() test case -------------------------- no define: false set NULL: false set 0: true set false: true set blank: true set blank array: true unset: false
何か知らないけど NULL をセットしても isset() は false を返す。
結局 NULL をセットするという行為は、変数を unset() するのと同じって事なのだろうか?
次は is_null() で、これは引数の値が NULL かどうかを判断して true/false を返す。
とりあえずテストコードと結果を見てみる。
echo "is_null() test case --------------------------<br />"; echo "no define: " . (( is_null($var) ) ? "true" : "false") . "<br />"; $var = NULL; echo "set NULL: " . (( is_null($var) ) ? "true" : "false") . "<br />"; $var = 0; echo "set 0: " . (( is_null($var) ) ? "true" : "false") . "<br />"; $var = false; echo "set false: " . (( is_null($var) ) ? "true" : "false") . "<br />"; $var = ""; echo "set blank: " . (( is_null($var) ) ? "true" : "false") . "<br />"; $var = array(); echo "set blank array: " . (( is_null($var) ) ? "true" : "false") . "<br />"; unset($var); echo "unset: " . (( is_null($var) ) ? "true" : "false") . "<br />";
is_null() test case -------------------------- Notice: Undefined variable: var in C:\wamp\www\test\var.php on line 28 no define: true set NULL: true set 0: false set false: false set blank: false set blank array: false Notice: Undefined variable: var in C:\wamp\www\test\var.php on line 46 unset: true
変数が初期化されてない場合と unset() した後は notice error を受けますが、結果としては true を返すみたい。
notice エラーは排除した方がいいですが、ようは isset() の反対みたいな感じみたいなものかな。
でも先ほど isset() で述べた「 NULL をセットするという行為は、変数を unset() するのと同じ」って言うのは嘘だったぽい。
NULL をセットしても notice エラーを受け取らないですからね。
というか、ここが俺が嫌いなところの一つ目です。
次に === 演算子で NULL と比較してみる。これは is_null() と同様の結果が返ってくることを期待する。
echo "=== NULL test case --------------------------<br />"; echo "no define: " . (( $var === NULL ) ? "true" : "false") . "<br />"; $var = NULL; echo "set NULL: " . (( $var === NULL ) ? "true" : "false") . "<br />"; $var = 0; echo "set 0: " . (( $var === NULL ) ? "true" : "false") . "<br />"; $var = false; echo "set false: " . (( $var === NULL ) ? "true" : "false") . "<br />"; $var = ""; echo "set blank: " . (( $var === NULL ) ? "true" : "false") . "<br />"; $var = array(); echo "set blank array: " . (( $var === NULL ) ? "true" : "false") . "<br />"; unset($var); echo "unset: " . (( $var === NULL ) ? "true" : "false") . "<br />";
=== NULL test case -------------------------- Notice: Undefined variable: var in C:\wamp\www\test\var.php on line 28 no define: true set NULL: true set 0: false set false: false set blank: false set blank array: false Notice: Undefined variable: var in C:\wamp\www\test\var.php on line 46 unset: true
うん。全く一緒ぽい。これは素直だ。
次に == 演算子で NULL と比較する。一体全体何で === と == の二つを作ったのか分からないのだが、まあ便利なところもあるんだろうな。きっと。
で、これは実は結構驚きの結果が。
echo "== NULL test case --------------------------<br />"; echo "no define: " . (( $var == NULL ) ? "true" : "false") . "<br />"; $var = NULL; echo "set NULL: " . (( $var == NULL ) ? "true" : "false") . "<br />"; $var = 0; echo "set 0: " . (( $var == NULL ) ? "true" : "false") . "<br />"; $var = false; echo "set false: " . (( $var == NULL ) ? "true" : "false") . "<br />"; $var = ""; echo "set blank: " . (( $var == NULL ) ? "true" : "false") . "<br />"; $var = array(); echo "set blank array: " . (( $var == NULL ) ? "true" : "false") . "<br />"; unset($var); echo "unset: " . (( $var == NULL ) ? "true" : "false") . "<br />";
== NULL test case -------------------------- Notice: Undefined variable: var in C:\wamp\www\test\var.php on line 76 no define: true set NULL: true set 0: true set false: true set blank: true set blank array: true Notice: Undefined variable: var in C:\wamp\www\test\var.php on line 94 unset: true
なんか知らんが全部 true 。 == で NULL と比較すると、 0 も "" も空の配列ですら全部 NULL らしい。
まあ納得しようとすればできるんだけど、何て説明していいのか分からない。
感覚的には分かるかな。 == と === の違い。
続いて === で false と比較する。だんだん疲れてきた。
echo "=== false test case --------------------------<br />"; echo "no define: " . (( $var === false ) ? "true" : "false") . "<br />"; $var = NULL; echo "set NULL: " . (( $var === false ) ? "true" : "false") . "<br />"; $var = 0; echo "set 0: " . (( $var === false ) ? "true" : "false") . "<br />"; $var = false; echo "set false: " . (( $var === false ) ? "true" : "false") . "<br />"; $var = ""; echo "set blank: " . (( $var === false ) ? "true" : "false") . "<br />"; $var = array(); echo "set blank array: " . (( $var === false ) ? "true" : "false") . "<br />"; unset($var); echo "unset: " . (( $var === false ) ? "true" : "false") . "<br />";
=== false test case -------------------------- Notice: Undefined variable: var in C:\wamp\www\test\var.php on line 100 no define: false set NULL: false set 0: false set false: true set blank: false set blank array: false Notice: Undefined variable: var in C:\wamp\www\test\var.php on line 118 unset: false
とにかく false がセットされてなければ全部 false になる。これも素直ですね。 === は素直です。
そして最後に == 演算子で false と比較。今までの結果から考えると波乱の予感。
echo "== false test case --------------------------<br />"; echo "no define: " . (( $var == false ) ? "true" : "false") . "<br />"; $var = NULL; echo "set NULL: " . (( $var == false ) ? "true" : "false") . "<br />"; $var = 0; echo "set 0: " . (( $var == false ) ? "true" : "false") . "<br />"; $var = false; echo "set false: " . (( $var == false ) ? "true" : "false") . "<br />"; $var = ""; echo "set blank: " . (( $var == false ) ? "true" : "false") . "<br />"; $var = array(); echo "set blank array: " . (( $var == false ) ? "true" : "false") . "<br />"; unset($var); echo "unset: " . (( $var == false ) ? "true" : "false") . "<br />";
== false test case -------------------------- Notice: Undefined variable: var in C:\wamp\www\test\var.php on line 125 no define: true set NULL: true set 0: true set false: true set blank: true set blank array: true Notice: Undefined variable: var in C:\wamp\www\test\var.php on line 143 unset: true
全部 true かよ。もう == 演算子は信用できません。 == NULL と一緒の結果なんだ。
まとめと言っても特に無いけど、これらの PHP の実装には意外と注意が必要です。
気をつけましょう。