主に IT 技術を整理するためにメモ的に書き溜めています。少しだけフリーソフトもあるよ。コメントを残すには、 facebook を使ってください。

isset(), is_null(), ===, ==, NULL, false

最終更新日 2008-08-30 05:56:44 (1年以上前の記事です)

今回は PHP を理解する中でもっとも難しいとされている isset() 関数や is_null() 関数や、false や NULL に対する == や === 演算子の結果についてまとめてみた。

何が難しいかって別に分かれば難しくないんだけど、はっきり言ってややこしすぎる。
俺はこの PHP の実装があまり好きじゃない。
でもとにかくこれは理解しておかないと、後々よく分からないバグではまったりするので一応まとめてみた。

isset()

この関数は引数の値に何らかの値がセットされているかどうかを判断して、 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()

次は 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

次に === 演算子で 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


次に == 演算子で 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

続いて === で 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

そして最後に == 演算子で 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 の実装には意外と注意が必要です。
気をつけましょう。

最終更新日 2008-08-30 05:56:44

コメント このエントリーをはてなブックマークに追加

フリーソフトウエア
EnjoiFLV
EnjoiPacket
EnjoiCrypto
ランキング
rank1, rank2, rank3, rank7, rank9, rank10, rank11
todo メモ
facebook 対応
ページ処理
RSS feed
検索機能
認証いる?
更新日表示
実はカテゴリ機能
多言語
実はユーザ機能
ソースその内公開
動作環境メモ
php-5.1.6 with PDO
SQLite-3.3
IE6
FireFox-1.5
RSS
非認証

検索
Google