2022-02-28
【初心者向け】PHPエラーの種類とその原因
PHPに限らず、プログラミング初心者が避けて通れないのがタイピングミスや知識不足によるエラー。
PHPであればエラーの内容が画面に出力されます。エラーの種類、重要度によって出力後の挙動が異なりますが、英語で表示されることもあり、はじめはどのようなエラーで、それがどのような問題なのかがわかりません。今回はエラーの種類と内容についてまとめました。
大きく分けるとレベルに応じて4種類のエラーがある
一番上のFatal errorエラーが最も致命的なエラーで、下にゆくにつれてエラーのレベルが下がります。
- Fatal error
- Parse error
- Warning
- Notice
Fatal error / 致命的エラー
PHPのエラーで最も重いのが「Fatal error」。実行時の「状態」にそもそも問題があります。「致命的エラー」と訳され、このエラーが表示される事由がある場合、処理が中断されます。
考えられる原因
①未定義関数の呼び出し
②同じ関数名を重複して定義
②外部モジュールに関するエラー
など
サンプル
// スペルミスでget_message()が定義されていない
function get_messageeeeee() {
echo "関数の呼び出し";
}
get_message();
Fatal error: Uncaught Error: Call to undefined function get_message() in ...
Parse error / 構文エラー
初学者がもっとも遭遇しやすいエラーが「Parse error」です。「構文エラー」と訳され、PHPの文法に誤りあるときに表示されます。
大半はセミコロンがらみ、カッコの閉じ忘れが原因ですが、表示されているされている行と、実際の問題がある箇所が異なる場合があります。慣れればすぐに特定できるようになりますが、はじめのうちは特定に時間を要してしまうかもしれません。
考えられる原因
①セミコロン忘れ、閉じ忘れ
②括弧の閉じ忘れ
③全角スペースが混入
など
サンプル
// 「)」がぬけている(閉じられていない)
echo ('Hello World.';
Parse error: syntax error, unexpected ';' in ...
Warning / 警告
「Fatal error」や「Parse error」と比べて軽微なエラー。エラーがあってもプログラム処理は中断されず実行を続けます。
include関数などでファイルの呼び出しなどを行った際に、リソースを読み込めない場合発生するのが多いのではないでしょうか。
考えられる原因
②ファイルの参照に失敗(ファイル名の間違い)
②データの型が一致しない
Notice / 通知
Noticeは、定義されていない変数を使用しようとした時に表示されます。
考えられる原因
①関数の引数がおかしい
②未定義変数の呼び出し
エラー表示/非表示を制御する
エラーメッセージにスクリプトのパスが表示されるため、本番環境ではセキュリティ上望ましくありません。開発環境であればエラー表示がデバッグに役立ちますが、エラーを非表示にすることもできます。
php.iniで定義
エラー表示
display_errors = On
エラー非表示
display_errors = Off
phpスクリプトで定義
エラー表示
ini_set('display_errors', 1);
エラー非表示
ini_set('display_errors', 0);
.htaccessで定義
エラー表示
php_flag display_errors on
エラー非表示
php_flag display_errors off
エラー表示を柔軟に行う
実際には、表示させたいレベルのエラーを指定して、環境に合わせた設定を行うのが望ましいと考えます。わたしは、phpスクリプト側に共通の設定ファイルを用意し、コントロールできるようにしています。下記、いくつか設定例をご紹介します。
// 全てのエラー出力をオフにする
error_reporting(0);
// 全ての PHP エラーを表示する
error_reporting(-1);
// 全ての PHP エラーを表示する
error_reporting(E_ALL);
// 単純な実行時エラーを表示する
error_reporting(E_ERROR | E_WARNING | E_PARSE);
// E_NOTICE を表示
error_reporting(E_ERROR | E_WARNING | E_PARSE | E_NOTICE);
// E_NOTICE 以外の全てのエラーを表示する
error_reporting(E_ALL & ~E_NOTICE);
// error_reporting(E_ALL); と同じ
ini_set('error_reporting', E_ALL);
フレームワークを使用する場合はフレームワーク側にコンフィグファイルが用意されており、そのファイル内で定義することとなると思います。
まとめ
PHP初学者のみならず、ベテランのプログラマであってもタイプミスはよくあります。実務では、開発環境においてはエラーの原因を早急に特定し対応するためにエラーを表示させますが、本番環境ではスクリプトエラーを表示させません。開発環境でしっかりとエラーを潰し、本番環境では精度の高い状態のスクリプトを実行させましょう。
ごくまれに、Noticeなど軽いエラーを表示させたまま放置されているサイトを見かけますが、エラーはエンドユーザに見せるべきではありません。環境に応じて適切な表示設定、コントロールを行いましょう。