Warning: Undefined variable が出ても実行が止まらない理由
宣言していない変数を参照するとWarningが出ますが、PHPはこれをエラーとして扱わず実行を続けます。参照した箇所の値はnullとして扱われます。
なぜエラーが出ないのか
Warning: Undefined variable $userName in main.php on line 2
main.php- ファイル名
2- 行番号
Warning- 種別 — 実行は止まりません。メッセージが出力に混ざるだけです
Undefined variable $userName- 内容 — 何が起きたか
このエラーが出る典型パターン
パターン1
1 <?php 2 echo $userName; ^
$userNameは一度も定義されていません。PHPはWarningを出すだけで実行を続け、その値はnullとして扱われます。
直し方: $userName を "Al" にします。
パターン2
1 <?php 2 function greet() { 3 echo $message; ^ 4 } 5 greet();
関数の中でも定義していない変数を参照すればWarningになります。実行は止まらず処理が先に進む点に注意してください。
直し方: $message を "Hello" にします。
パターン3
1 <?php 2 $total = 0; 3 $total = $total + $price; ^ 4 echo $total;
$priceは定義されていないため、足し算にnull(0扱い)が紛れ込みます。Warningが出ても処理は続行され、結果だけが静かにおかしくなります。
直し方: $price を 50 にします。
パターン4
1 <?php 2 echo $cityName; ^
$cityNameは一度も定義されていません。PHPはWarningを出すだけで実行を続けます。
直し方: $cityName を "Tokyo" にします。
パターン5
1 <?php 2 function describe() { 3 echo $label; ^ 4 } 5 describe();
関数の中でも定義していない変数を参照すればWarningになります。実行は止まらず処理が先に進みます。
直し方: $label を "Book" にします。
よくある誤解
「Warningが出たらプログラムはそこで止まっているはず」という思い込みは誤りです。PHPのWarningは出力に混ざるだけで、処理はそのまま先に進みます。気づかずに実行し続けてしまう危険があります。
実務での勘所
この警告の深刻度はPHP7ではE_NOTICE(最も軽微な部類)でしたが、PHP8ではE_WARNINGに格上げされました。さらに、この警告が実際に画面やログに出るかどうかは、error_reportingやdisplay_errorsという設定次第です。本番環境では警告の表示を意図的に抑制していることが多く、開発環境では見えていたはずのこの種のバグの兆候が、本番では完全に見えなくなっていることがあります。ログファイルには記録されている場合が多いので、動作がおかしいときは表示だけでなくログも確認する価値があります。