【PHP8.x】NULL定数の使い方
NULL定数の使い方について、初心者にもわかりやすく解説します。
基本的な使い方
NULL定数は値が存在しないこと、または未定義であることを表す特別な定数です。PHPにおいて、NULLは変数がまだ具体的な値を持っていない状態や、特定の操作が有効な結果を返さない状況を示すために用いられます。
例えば、変数を宣言した直後でまだ何も代入されていない場合や、関数の戻り値として「何も見つからなかった」といった状態を示す際に使用されます。これは、数値のゼロや空の文字列、ブール値のfalseとは根本的に異なる概念です。ゼロや空文字列、falseは何らかの具体的な値であるのに対し、NULLは「値そのものが存在しない」ことを明確に表現します。
PHPでは、NULLは大文字と小文字を区別せず、null、Nullなどと記述しても同じ意味を持ちます。ある変数がNULLであるかどうかをプログラム内で確認するには、is_null()関数を使用するのが最も確実な方法です。また、isset()関数は、変数が設定されており、かつNULLではない場合にのみtrueを返します。
このNULLという概念を理解し適切に扱うことは、プログラムが予期せぬ動作をすることなく、より堅牢で信頼性の高いシステムを構築するために不可欠です。
構文(syntax)
1$variable = NULL;
引数(parameters)
引数なし
引数はありません
戻り値(return)
null
PHPのNULL定数は、値が存在しないことを示す特別な値です。変数が初期化されていない場合や、明示的に値がないことを示したい場合などに使用されます。
サンプルコード
PHPでのNULL判定方法を解説する
1<?php 2 3/** 4 * PHPにおけるNULLの判定方法を示すサンプルコードです。 5 * システムエンジニアを目指す初心者向けに、主要な判定方法とその違いを解説します。 6 */ 7function demonstrateNullChecks(): void 8{ 9 echo "--- PHPにおけるNULL判定のデモンストレーション ---" . PHP_EOL . PHP_EOL; 10 11 // NULL判定の対象となる変数群を準備します 12 $explicitlyNull = null; // 明示的にNULLが代入された変数 13 $nonNullString = "Hello PHP"; // NULLではない文字列 14 $zeroInteger = 0; // 整数値の0 15 $emptyString = ""; // 空文字列 16 17 echo "【変数の初期状態】" . PHP_EOL; 18 echo "\$explicitlyNull: " . var_export($explicitlyNull, true) . PHP_EOL; 19 echo "\$nonNullString: " . var_export($nonNullString, true) . PHP_EOL; 20 echo "\$zeroInteger: " . var_export($zeroInteger, true) . PHP_EOL; 21 echo "\$emptyString: " . var_export($emptyString, true) . PHP_EOL; 22 echo "(未定義の変数は直接 var_export() で表示できません)" . PHP_EOL . PHP_EOL; 23 24 25 echo "【1. === null (厳密な等価演算子) による判定】" . PHP_EOL; 26 echo " - 変数の値が厳密に 'null' であるかをチェックします。" . PHP_EOL; 27 echo " - 型と値の両方が 'null' と一致する場合のみ true を返します。" . PHP_EOL; 28 echo " - 未定義の変数に適用するとエラー (E_WARNING) になる可能性があります。" . PHP_EOL; 29 echo " \$explicitlyNull === null: " . var_export($explicitlyNull === null, true) . PHP_EOL; // true 30 echo " \$nonNullString === null: " . var_export($nonNullString === null, true) . PHP_EOL; // false 31 echo " \$zeroInteger === null: " . var_export($zeroInteger === null, true) . PHP_EOL; // false 32 echo " \$emptyString === null: " . var_export($emptyString === null, true) . PHP_EOL; // false 33 echo PHP_EOL; 34 35 echo "【2. is_null() 関数による判定】" . PHP_EOL; 36 echo " - `=== null` と同じく、変数の値が厳密に 'null' であるかをチェックします。" . PHP_EOL; 37 echo " - より読みやすく、NULL判定の意図が明確になります。" . PHP_EOL; 38 echo " - 未定義の変数に適用するとエラー (E_WARNING) になる可能性があります。" . PHP_EOL; 39 echo " is_null(\$explicitlyNull): " . var_export(is_null($explicitlyNull), true) . PHP_EOL; // true 40 echo " is_null(\$nonNullString): " . var_export(is_null($nonNullString), true) . PHP_EOL; // false 41 echo " is_null(\$zeroInteger): " . var_export(is_null($zeroInteger), true) . PHP_EOL; // false 42 echo " is_null(\$emptyString): " . var_export(is_null($emptyString), true) . PHP_EOL; // false 43 echo PHP_EOL; 44 45 echo "【3. isset() 関数による判定】" . PHP_EOL; 46 echo " - 変数が『設定されており、かつ NULL ではない』かをチェックします。" . PHP_EOL; 47 echo " - 変数が未定義の場合や、値が 'null' の場合は false を返します。" . PHP_EOL; 48 echo " - 未定義の変数に対してもエラーを発生させずに評価できます。これは isset() の特別な挙動です。" . PHP_EOL; 49 $yetUndefinedVariable; // この変数はまだ定義されていません 50 echo " isset(\$explicitlyNull): " . var_export(isset($explicitlyNull), true) . PHP_EOL; // false 51 echo " isset(\$nonNullString): " . var_export(isset($nonNullString), true) . PHP_EOL; // true 52 echo " isset(\$zeroInteger): " . var_export(isset($zeroInteger), true) . PHP_EOL; // true 53 echo " isset(\$emptyString): " . var_export(isset($emptyString), true) . PHP_EOL; // true 54 echo " isset(\$yetUndefinedVariable): " . var_export(isset($yetUndefinedVariable), true) . PHP_EOL; // false (未定義のため) 55 echo PHP_EOL; 56 57 echo "【4. empty() 関数による判定】" . PHP_EOL; 58 echo " - 変数の値が『空である』かをチェックします。" . PHP_EOL; 59 echo " - 'null', 0, 0.0, '0', 空文字列(\"\"), 空配列([]), false など、様々な『空』とみなされる値に対して true を返します。" . PHP_EOL; 60 echo " - 未定義の変数に対してもエラーを発生させずに評価できます。これは empty() の特別な挙動です。" . PHP_EOL; 61 $anotherUndefinedVariable; // この変数もまだ定義されていません 62 echo " empty(\$explicitlyNull): " . var_export(empty($explicitlyNull), true) . PHP_EOL; // true 63 echo " empty(\$nonNullString): " . var_export(empty($nonNullString), true) . PHP_EOL; // false 64 echo " empty(\$zeroInteger): " . var_export(empty($zeroInteger), true) . PHP_EOL; // true 65 echo " empty(\$emptyString): " . var_export(empty($emptyString), true) . PHP_EOL; // true 66 echo " empty(\$anotherUndefinedVariable): " . var_export(empty($anotherUndefinedVariable), true) . PHP_EOL; // true (未定義のため) 67 echo PHP_EOL; 68} 69 70// 関数を実行します 71demonstrateNullChecks();
PHPにおけるNULLは、値が存在しないことを示す特別な定数です。このサンプルコードでは、PHP 8で変数がNULLであるかを判定する主要な方法とその違いを解説しています。
まず、=== null(厳密な等価演算子)とis_null()関数は、変数が厳密にNULLであるかをチェックします。これらは、変数の値と型がともにNULLである場合にのみtrueを返し、整数値の0や空文字列などとは区別します。is_null()は引数として渡された変数を評価し、NULLであればtrueを、そうでなければfalseを戻り値として返します。これらの方法を未定義の変数に適用すると警告が発生する可能性があります。
次に、isset()関数は、変数が「設定されており、かつNULLではない」かを判定します。NULLが代入された変数や未定義の変数に対してはfalseを返しますが、未定義の変数に適用してもエラーは発生しません。
最後に、empty()関数は、変数の値が「空である」かをチェックします。NULLの他にも、0、0.0、空文字列、空配列、falseなど、PHPで「空」とみなされる様々な値に対してtrueを返します。isset()と同様に、未定義の変数に対してもエラーを発生させずに評価できます。
これらの判定方法はそれぞれ異なる目的を持つため、変数の状態や求める条件に応じて適切な方法を選択することが重要です。
PHPでNULLを判定する際には、どの方法を使うかによって挙動が大きく異なります。=== nullやis_null()は厳密にNULLであるかを判定しますが、未定義の変数に適用すると警告が発生する可能性があります。一方、isset()は変数が設定されており、かつNULLではないかを安全に確認でき、未定義変数にもエラーなく適用可能です。また、empty()はNULLの他に、数値の0や空文字列なども「空」と判定し、未定義変数にも安全に利用できます。それぞれの判定方法の特性を理解し、目的に応じて適切に使い分けることが、予期せぬエラーを防ぎ、堅牢なコードを書くための重要なポイントです。
PHP NULL合体演算子でデフォルト値を設定する
1<?php 2 3// NULL合体演算子 (??) は、変数が未定義またはNULLの場合にデフォルト値を設定するPHP 7.0で導入された機能です。 4// これにより、isset() と三項演算子を組み合わせた従来の記述を簡潔にできます。 5 6// -------------------------------------------------------------------------------- 7// 1. 基本的な使い方 8// -------------------------------------------------------------------------------- 9 10// ユーザー名が格納される可能性のある変数 11$userName = null; // 現在はNULL 12$userAge = 30; // NULLではない値 13// $userEmail; // この変数は意図的に定義しません (未定義の場合の動作を確認するため) 14 15echo "--- NULL合体演算子 (??) の基本的な使用例 ---" . PHP_EOL; 16 17// $userName が NULL なので、「ゲスト」が $displayName に代入されます。 18$displayName = $userName ?? 'ゲスト'; 19echo "ユーザー名: " . $displayName . PHP_EOL; // 出力: ゲスト 20 21// $userAge は NULL ではないので、$userAge の値 (30) が $displayAge に代入されます。 22$displayAge = $userAge ?? 25; 23echo "ユーザー年齢: " . $displayAge . PHP_EOL; // 出力: 30 24 25// 未定義の変数 $userEmail を使用した場合 26// PHP 7.0 以降、未定義の変数に対して ?? を使用しても「Undefined variable」のNOTICEは発生しません。 27$displayEmail = $userEmail ?? '未設定'; 28echo "ユーザーメール: " . $displayEmail . PHP_EOL; // 出力: 未設定 29 30echo PHP_EOL; 31 32// -------------------------------------------------------------------------------- 33// 2. 従来の記述方法との比較 34// -------------------------------------------------------------------------------- 35 36echo "--- 従来の isset() と三項演算子を使った記述 (比較用) ---" . PHP_EOL; 37 38// $userName が NULL の場合、'ゲスト (旧)' が代入されます。 39$oldDisplayName = isset($userName) ? $userName : 'ゲスト (旧)'; 40echo "ユーザー名 (旧方式): " . $oldDisplayName . PHP_EOL; // 出力: ゲスト (旧) 41 42// 未定義の $userEmail の場合、'未設定 (旧)' が代入されます。 43$oldDisplayEmail = isset($userEmail) ? $userEmail : '未設定 (旧)'; 44echo "ユーザーメール (旧方式): " . $oldDisplayEmail . PHP_EOL; // 出力: 未設定 (旧) 45 46echo PHP_EOL; 47 48// -------------------------------------------------------------------------------- 49// 3. 複数のNULL合体演算子の連結 50// -------------------------------------------------------------------------------- 51 52// 複数の候補から最初にNULLではない値を見つけて使用できます。 53$prefName = null; 54$cityName = null; 55$townName = '中央区'; 56$defaultLocation = '日本'; 57 58echo "--- 複数のNULL合体演算子の連結 ---" . PHP_EOL; 59 60// 左から順に評価され、最初にNULLではない値が見つかった時点でその値が採用されます。 61// $prefName (NULL) ?? $cityName (NULL) ?? $townName ('中央区') 62$location = $prefName ?? $cityName ?? $townName ?? $defaultLocation; 63echo "ユーザー所在地: " . $location . PHP_EOL; // 出力: 中央区 64 65// すべての候補がNULLの場合 66$countryName = null; 67$continentName = null; 68 69$finalLocation = $prefName ?? $cityName ?? $countryName ?? $continentName ?? $defaultLocation; 70echo "最終所在地: " . $finalLocation . PHP_EOL; // 出力: 日本 71 72?>
PHPの内部定数であるNULLは、値が存在しないことや未定義の状態を示す特別な値です。この定数は引数を取らず、常にnullという値を返します。
PHP 7.0で導入されたNULL合体演算子(??)は、変数がNULLであるか、あるいは全く定義されていない場合に、代わりにデフォルト値を設定するための簡潔な方法を提供します。例えば $userName = null; のように値がnullの場合や、$userEmail; のように変数が未定義の場合でも、$userName ?? 'ゲスト' と書くことで、$userNameがnullならば'ゲスト'が、nullでなければ$userName自身の値が使われます。これにより、isset($userName) ? $userName : 'ゲスト' といった従来のisset()関数と三項演算子を組み合わせた記述をよりシンプルに置き換えることが可能です。
この演算子を未定義の変数に適用しても、PHP 7.0以降では「Undefined variable」のNOTICE(通知)が発生しません。さらに、$prefName ?? $cityName ?? $townName ?? '日本' のように複数の??を連結して使用することも可能です。この場合、左から順に変数を評価し、最初にNULLではない値が見つかった時点でその値が採用されます。もしすべての変数がNULLであれば、最も右側のデフォルト値が最終的に使用されます。NULL合体演算子は、値の有無に応じた柔軟なデフォルト値設定を可能にし、コードの可読性と保守性を向上させます。
NULL合体演算子 (??) は、変数が未定義かNULLの場合にのみデフォルト値を設定します。FALSE、数値の0、空文字列などはNULLと区別されるため、これらが設定されている変数にはデフォルト値ではなく元の値が使われますので注意が必要です。PHP 7.0以降、未定義変数に??を使っても「Undefined variable」の通知は出ませんが、意図しない変数名の誤りには注意しましょう。複数の??を連結すると、左から順に評価され、最初に見つかったNULLではない値が採用されます。コードを安全かつ簡潔にするために活用してください。