この記事の要点
- PHPのNULLは「値を何も持っていない状態」を指す値
- NULLはNULL型、空文字は文字列型で、型が違う
- NULLや空文字を判定するためには「== null」「== “”」「is_null」「empty」「isset」の5種類の方法がある
以前、PHPとはどんな言語なのか、PHPの基礎をご紹介していました。
PHPにおいて「値を何も持っていない状態」を表しているのがNULL(ヌル)です。
変数がNULLかどうかを判定する方法は、大きく分けて5種類あります。
- 「== null」
- 「== “”」
- 「is_null」
- 「empty」
- 「isset」
NULLと同じように使われる「空文字」とともに、「変数に値がない状態」を正しく認識し、使い分けられるようにしましょう。
目次
NULLってなに?空文字との違いとは
NULL(ヌル)という言葉をご存じでしょうか。
非プログラマーには聞きなれない言葉かもしれません。
プログラミング言語において、NULLは「値を何も持っていない状態」「存在していない状態」を指します。
「値がないなら無視すればよくない?」と思うかもしれません。しかしプログラミング言語の世界では、「値のない値」というものが確かに存在し、それが時に大きな問題を引き起こすことがあります。
まるで亡霊のような存在のNULLですが、だからこそ正しく理解して使いこなすことが大切なのです。
同じく値を持っていないものに「空文字」がありますが、NULLは別のものとして扱われます。
NULLは数値型でも文字列型でも時刻型でもなく、「何物でもない」存在。
それに対して空文字は、型は「文字列型」で値が何も入っていない状態を指します。
PHPにおけるNULLの定義
PHPにおけるNULLは、「null型の唯一の値」であり、マニュアルによると、以下の状態の場合にNULLと見なされるとされています。
- 定数 null が代入されている場合
- まだ値が何も代入されていない場合
- unset() されている場合
PHPマニュアルより
PHPは、Javaのようなオブジェクト指向の強い言語とは異なり、「型」という概念が薄くあいまいな性質を持っています。
そのため、PHPでプログラミングを行う際は、「NULL」「空文字」を強く意識することなくコーディングを行うことができます。
NULL/空文字の判定方法は5種類ある!
NULLと空文字を判定する方法は、大きく分けて5種類あります。
1つずつご説明していきましょう。
「== null」による判定
NULLは、比較演算子+NULL(「== null」)によって判定することができます。
比較対象の値がNULLの場合、if判定によってtrueの結果が得られます。
例:
$string = null; //NULLを代入 if ($string == null) { echo "文字列はnullです"; }
実行結果:
文字列はnullです
それでは、次の例はどうでしょうか。
例:
$string =””; //空文字を代入 if ($string === null) { echo "文字列はnullです"; }
実行結果:
(なし)
$stringには空文字を代入し、「===null」による判別を行ったところ、結果、何も出力されませんでした。
これは、if判定の際に比較演算子として「===」が使われているためです。
比較演算子「===」は、型も含めた一致・不一致を判定します。
例の場合、$stringの値は空文字(文字列)であり、if判定では「値がNULLであるか」と同時に「型がNULL型か」を確認しているため、不一致とみなされたことになります。
「== ""」による判定
NULLは比較演算子+空文字(「== ""」)によって判定することができます。
PHPは型の判定があいまいな性質を持っているため、NULLを空文字とも判断されます。
そのため、比較演算子による判定では「== ""」としてもtrueの結果が得られるのです。
例:
$string = null; //NULLを代入 if ($string == "") { echo "文字列は空文字です"; }
実行結果:
文字列は空文字です
例の場合、$stringにはNULLを代入していますが、if判定では空文字でもNULLと同じ扱いであることが分かります。
なお、$stringに空文字("")を代入した場合も、同様の結果が得られます。
「is_null」による判定
NULLはis_null関数でも判定することができます。
is_nullは、引数に指定された変数がnullかどうか判断し、結果をtrueあるいはfalseの真偽値で返す関数です。
例:
$string = null; //NULLを代入 if (is_null($string)) { echo "文字列はis_nullです"; }
実行結果:
文字列はis_nullです
「empty」による判定
NULLの判定は、empty関数を利用して行うこともできます。
empty関数は、引数に指定された変数が空かどうか判断し、trueあるいはfalseの真偽値で返します。
なお、ここでいう「空」というのは、空文字、NULL、0といった「値の初期値」を指しています。
例:
$string = null; //NULLを代入 if (empty($string)) { echo "文字列はemptyです"; }
実行結果:
文字列はemptyです
「isset」による判定
PHPのisset関数でも、NULLを判定することができます。
isset関数は、引数に指定された変数が「宣言されている」、さらに「nullとは異なる値である」と判断された場合にのみtrueを返します。
emptyやis_nullとは挙動が逆である点に注意してください。
例:
$string = null; //NULLを代入 if (isset($string)) { echo "文字列はissetです"; }
実行結果:
(なし)
$stringにはNULLが代入されているため、issetの判定ではfalseが返され、実行結果は何も表示されませんでした。
なお、isset関数は複数の引数を渡すことができます。
その場合、すべての引数の値がセットされている場合にのみtrueを返します。
例:
$string1 = "apple"; $string2 =”grape”; $string3 = "orange"; $string4 = "pineapple"; $string5 = null; if (isset($string1, $string2, $string3, $string4, $string5)) { echo "文字列はissetです"; }
実行結果:
(なし)
例の場合、$string1から$string4までには文字列が入っていますが、$string5にはNULLが入っています。
そのため、issetでの判定ではfalseが返され、実行結果には何も表示されなかったのです。
NULL判定の早見表
ご紹介してきた5つの判定方法を表にまとめましたので、参考にしてください。
== "" | == null | === null | is_null | empty | isset | |
---|---|---|---|---|---|---|
$ex = null | true | true | true | true | true | false |
$ex = "" | true | true | false | false | true | true |
$ex = 0 | false | true | false | false | true | true |
$ex = 1 | false | false | false | false | false | true |
$ex = "0" | false | false | false | false | true | true |
$ex = "1" | false | false | false | false | false | true |
$ex = [] | false | true | false | false | true | true |
===2段に分けたもの==
== "" | == null | === null | |
---|---|---|---|
$ex = null | true | true | true |
$ex = "" | true | true | false |
$ex = 0 | false | true | false |
$ex = 1 | false | false | false |
$ex = "0" | false | false | false |
$ex = "1" | false | false | false |
$ex = [] | false | true | false |
is_null | empty | isset | |
---|---|---|---|
$ex = null | true | true | false |
$ex = "" | false | true | true |
$ex = 0 | false | true | true |
$ex = 1 | false | false | true |
$ex = "0" | false | true | true |
$ex = "1" | false | false | true |
$ex = [] | false | true | true |
PHPではNULLも0も空文字もfalseもみんな同じ!?
PHPはプログラミング言語の中でも、型の定義が非常に曖昧です。
そのため、異なる値を比べても「同じ」と判定される場合があります。
PHPにおける型の定義
型に関して、PHPマニュアルには以下のように説明されています。
変数の型は、基本的にプログラマが設定するものではありません。
その変数が使用される文脈に応じ、PHPが実行時に決定します。
PHPマニュアルより引用
つまりPHPにおいて、「型」という概念はあるものの、よほどの理由がない限り私たちがコーディングで明示する必要はなく、PHPが内部的に判定を行っているということになります。
型にこだわらずコーディングできる性質ゆえ、PHPにはどんな型であっても値を表示することのできるvar_dump()という関数が存在しています。
NULLも0も空文字もfalseもみんな同じ!?
すでにご説明したとおり、PHPにおいて、NULLと空文字("")は同一のものと扱われる場合があります。
また、文字列型で空文字が「値がないもの」と判定されるように、数値型で「値がないもの」と判定されるのは「0」なので、NULLと「0」が同一のものとみなされる場合もあります。
さらに、PHPにおいて真偽値(true/false)は数値としても表現されることがあり、trueは「1」、falseは「0」あるいは空文字、NULLとして使うことができます。
そのため、NULLとfalseが同一のものとして扱われる場合もあります。
PHPのあいまいな型の性質を利用すれば、NULLも0も空文字もfalseもすべて「同じもの」として判断されることがあるのです。
厳密な判定には論理演算子「===」を利用しよう
このようなあいまいさのため、PHPによるコーディングでは時に、期待している結果とは異なる判定結果になってしまう場合があります。
特に真偽値は曲者で、初心者がハマりやすい部分なので注意が必要です。
期待している正しい結果を得るためには、判定の際に論理演算子「===」を利用するのが効果的です。
論理演算子「===」は、型も含めた値のチェックを行うため、PHP特有のあいまいさを回避することができます。
まとめ
PHPのプログラミングでは、「NULL」「空文字」といった型をあまり意識せずにコーディングすることができます。
しかし、NULLや空文字の正しい知識を持たないままにプログラミングをしていては、エラーなどの問題が発生した場合に正しく対応できません。
PHP特有の「型のあいまいさ」に甘えることなく、NULLや空文字について正しく知識を持ち、必要な場合に使えるよう学習を進めましょう。
他にも、C言語の初心者がつまずきやすいポイントの1つに「配列」があります。
配列は「ポインタ」と混同されやすいですが、システム開発に携わる場合、配列の操作はほぼ必須です。
C言語の配列とポインタとの違い、初期化、コピーの方法、要素数の取得、多次元配列といった、初心者必修の基礎テクニックをわかりやすく解説していますので、こちらも参考にしてください。
またポインタについても、ポインタの使い方やメリット、ポインタを効果的に習得する方法を解説していますので、こちらも参考にしてください。