?? を使わずに存在しないキーへアクセスするとWarningが混ざる
配列のキーが存在するか分からない場合、??演算子を使えばWarningを出さずにデフォルト値を指定できます。??を使わずにそのままアクセスすると、Undefined array keyのWarningが出力に混ざります。
なぜエラーが出ないのか
出力:
(エラーなし)- PHPは何も報告しません。文法として正しいためです
出力:- 実際の挙動 — 期待した結果と食い違っている箇所
見つけ方- エラーが出ないので、出力を目で確かめるか、コードを目で追うしかありません。この種の誤りが最も発見が遅れます
このエラーが出る典型パターン
パターン1
1 <?php 2 $config = ["timeout" => 30]; 3 $retries = $config["retries"] or 3; ^ 4 echo $retries;
出力:
Warning: Undefined array key "retries" in main.php on line 3期待: 3 (Warningなしで済むはずが混ざってしまいます)
orは真偽値としての判定であってデフォルト値の指定にはなりません。存在しないキーへの直接アクセスがそのまま実行され、Warningが出力に混ざります。??を使えば1行でWarning無しにデフォルト値を指定できます。
直し方: or を ?? にします。
広告
広告スロット(未設定)
パターン2
1 <?php 2 $settings = ["theme" => "dark"]; 3 $lang = $settings["lang"] or "ja"; ^ 4 echo $lang;
出力:
Warning: Undefined array key "lang" in main.php on line 3期待: ja (Warningなしで済むはずが混ざってしまいます)
orでは存在しないキーへのアクセス自体は防げず、Warningが出力に混ざります。??を使う必要があります。
直し方: or を ?? にします。
パターン3
1 <?php 2 $env = ["debug" => false]; 3 $level = $env["level"] or "info"; ^ 4 echo $level;
出力:
Warning: Undefined array key "level" in main.php on line 3期待: info (Warningなしで済むはずが混ざってしまいます)
orは値の存在確認をしないため、存在しないキーへのアクセスがそのまま実行されWarningになります。
直し方: or を ?? にします。
よくある誤解
「isset()でチェックしてから使うのが唯一の方法」というのは古いスタイルです。??演算子を使えば1行でデフォルト値の指定とWarning回避を同時に行えます。
まとめ
?? を使わずに存在しないキーへアクセスするとWarningが混ざるは中級でつまずきやすい項目です。上の3パターンを実際に手で直すと、エラーメッセージのどこを読めばよいかが掴めます。