【PHP】PHPのNotice・Warning・Fatal Errorの違いと読み方

phpアイキャッチ PHP

こんにちは、かつコーチです。

前回まで、素のPHPでデータベースに接続する方法を扱ってきました。

mysqliPDOでコードを書いていると、赤い文字や見慣れない英語の羅列が画面にドバッと表示されて、心が折れそうになった人も多いのではないでしょうか。

今回はいったんDBから離れて、PHPを書いていると必ず出会う「エラーメッセージの読み方」を整理します。

エラーは敵ではなく、原因を教えてくれる「ヒント」です。

種類ごとの違いが分かれば、焦らず対処できるようになります。

PHPのエラーには「レベル」がある

なぜエラーに種類があるのか

PHPのエラーは、深刻度によっていくつかのレベルに分かれています。

これは「このままプログラムを止めるべきか、続けても大丈夫か」をPHP自身が判断しているためです。

すべてのエラーを同じ扱いにしてしまうと、軽微なミスでプログラム全体が止まってしまい、逆に不便になります。

代表的なレベルは次の3つです。

レベル深刻度処理は続く?
Notice / Deprecated低い続く
Warning中くらい続く
Fatal Error高い止まる

エラーメッセージの共通の読み方

レベルに関わらず、PHPのエラーメッセージには共通のフォーマットがあります。

PHP Warning:  Undefined array key "name" in /var/www/html/index.php on line 12

この1行には、実は必要な情報がすべて詰まっています。

  • PHP Warning → エラーのレベル
  • Undefined array key "name" → エラーの内容
  • in /var/www/html/index.php → 発生したファイル
  • on line 12 → 発生した行番号

私が初心者だった頃、この行末の「ファイル名」と「行番号」を見ずに、メッセージの文章だけを必死に読もうとして時間を無駄にしていました。

まず見るべきは「どのファイルの何行目で起きたか」です。

そこにピンポイントで飛べば、原因はだいたいすぐ見つかります。

Notice:一番軽いレベルのお知らせ

どんなときに出るか

Notice(ノーティス)は「一応知らせておきますね」程度の、一番軽いレベルのエラーです。

存在しない変数を使おうとしたときなどに表示されます。

<?php
// $userName を定義していない状態で使う
echo "こんにちは、" . $userName . "さん";
Warning: Undefined variable $userName in /var/www/html/index.php on line 3
こんにちは、さん

(PHP8以降はUndefined variableはWarning扱いになっています。バージョンによって扱いが変わる点は後述します)

処理自体は止まらず、$userNameの部分が空文字として扱われて実行が続きます。

放置していいわけではない理由

Noticeは処理が止まらないため、つい見過ごしがちです。

ですが「本来入っているはずの値が入っていない」というサインなので、意図した動きになっているか必ず確認する癖をつけましょう。

<?php
// ✅ 事前にisset()でチェックしてから使う
if (isset($userName)) {
    echo "こんにちは、" . $userName . "さん";
} else {
    echo "こんにちは、ゲストさん";
}

isset()は、変数が定義されていて中身がnullでないかを確認する関数です。

Warning:処理は続くが要注意のサイン

よく出会うWarningの例

Warning(ワーニング)はNoticeより一段階深刻ですが、こちらも処理自体は止まりません。

配列の存在しないキーにアクセスしたときなどによく出会います。

<?php
$user = ["name" => "かつコーチ"];

// "age" というキーは存在しない
echo $user["age"];
Warning: Undefined array key "age" in /var/www/html/index.php on line 5

かつコーチが実際につまずいたケース

私がこのエラーで一番苦労したのは、フォームから送られてきた入力値を扱っていたときです。

<?php
// ❌ Before:POSTデータのキーが必ずあると決めつけてしまう
$email = $_POST["email"];

チェックボックスやオプション項目を空のまま送信すると、そのキー自体が$_POSTに存在しないことがあります。

このとき「値が空文字」ではなく「キーがそもそもない」という状態になり、Warningが大量に出て画面が真っ赤になったことがありました。

原因が分からず30分ほど悩んだ末、var_dump($_POST);で中身を確認して初めて気づいたという苦い経験です。

<?php
// ✅ After:null合体演算子でキーの有無を安全に処理する
$email = $_POST["email"] ?? "";

??(null合体演算子)を使うと、「左側が存在しない、またはnullなら右側を使う」という処理を1行で書けます。

フォーム処理では、この書き方がほぼ標準の対処法になります。

Fatal Error:処理が止まる致命的なエラー

プログラムが完全に停止する

Fatal Error(致命的エラー)は、名前の通りプログラムの実行がその場で完全に止まってしまうレベルのエラーです。

存在しない関数を呼び出したときなどに発生します。

<?php
echo "処理開始";

// 定義していない関数を呼び出す
tashizan(1, 2);

echo "ここには到達しない";
処理開始
Fatal error: Uncaught Error: Call to undefined function tashizan() in /var/www/html/index.php:5
Stack trace:
#0 {main}
  thrown in /var/www/html/index.php on line 5

「処理開始」までは表示されますが、tashizan()の行でプログラムが止まり、その後のechoは実行されません。

Fatal Errorが出たときの読み方の順番

Fatal Errorのメッセージは長く見えて構えてしまいますが、読む順番は次の3ステップで十分です。

  1. Uncaught の後ろに書かれているエラーの種類と内容を読む(今回はCall to undefined function tashizan()
  2. 最後の行にあるon line 5でファイルと行番号を確認する
  3. Stack trace(どういう順番で処理が呼ばれたか)は、原因の関数名だけざっと拾えれば最初は十分

いきなり全部を理解しようとせず、「何が」「どこで」起きたかの2点をまず押さえるのがコツです。

<?php
// ✅ 関数名のタイプミスを直せば解決する
function tasu($a, $b) {
    return $a + $b;
}

echo tasu(1, 2);
// 出力: 3

Fatal Errorの原因のほとんどは、関数名や変数名のタイプミス、必要なファイルの読み込み忘れなど、単純なミスであることが多いです。

エラー表示の設定を理解しておく

本番環境ではエラーを表示しない

開発中はエラーを画面に表示させて気づけるようにしておきたい一方、本番環境ではユーザーにエラー内容を見せるべきではありません。

エラー内容には、ファイルパスなどサーバーの内部情報が含まれるためです。

<?php
// 開発環境向け:エラーをすべて画面に表示する
error_reporting(E_ALL);
ini_set("display_errors", "1");
<?php
// 本番環境向け:画面には表示せず、ログファイルに記録する
error_reporting(E_ALL);
ini_set("display_errors", "0");
ini_set("log_errors", "1");
ini_set("error_log", "/var/log/php/error.log");

開発中はこの設定をphp.iniやコードの先頭に入れておくと、Notice・Warningレベルの小さなミスにも早めに気づけます。

まとめ

この記事のポイント

  • PHPのエラーには主に「Notice」「Warning」「Fatal Error」の3つのレベルがある
  • Notice・Warningは処理が続くため見過ごしやすいが、意図しない値のサインとして必ず確認する
  • Fatal Errorは処理が完全に止まる。メッセージの「エラー内容」と「行番号」をまず読む
  • isset()??(null合体演算子)を使うと、未定義の変数・配列キーによるエラーを事前に防げる
  • 開発環境と本番環境でエラー表示の設定を切り替える

次に読むべき記事

エラーメッセージの読み方が分かったところで、次はもう1つよく出会う「ファイルが見つかりません」というエラーを扱っていきます。

→ 次の記事:「ファイルが見つかりません」エラーの原因と対処法

タイトルとURLをコピーしました