今回は、PHPのエラー出力に関する話です。
PHPの初期設定ファイルであるphp.iniには、error_reportingと呼ばれる設定項目が存在します。
・error_reportingを理解して使いこなせるようになりたい
このように思っている人もいることでしょう。
今回は、
について解説します。
error_reportingについて理解できれば、エラーの出力方法をうまく設定しこなせるようになります。ぜひ、参考にしてください。
目次
error_reportingについて
error_reportingは、出力するエラーメッセージの種類を設定できる項目です。php.iniと呼ばれる初期設定ファイルに記載されています。
1 |
error_reporting = E_ALL |
PHPでは、さまざまな種類のエラーメッセージを出力できます。しかし、闇雲にすべてのエラーメッセージを出力していると、エラーの原因を突き止めるのに時間を要します。
error_reportingで関係のないエラーを除外させることで、原因分析の作業の手間を省くことができるので効率的です。
PHPのエラーの種類
PHPで出力されるエラーには種類があり、種類ごとに対応するエラー定数が設けられています。
どのようなエラーメッセージがあるのか、詳しく解説していきましょう。
エラー定数(値) | 説明 |
---|---|
E_ERROR(1) | プログラム実行が不可能になるような致命的なエラーを出力 |
E_PARSE(4) | PHPの文法的なエラーを出力 |
E_WARNING(2) | E_ERRORほど致命的なものではないが、問題のある旨を出力 |
E_NOTICE(8) | E_WARNINGほど重要ではないが、問題になりうる旨を出力 |
E_USER_ERROR(256) | 独自に定義したエラーを出力 |
E_USER_WARNING(512) | 独自に定義したエラー(E_USER_ERRORほど致命的でない )を出力 |
E_USER_NOTICE(1024) | 独自に定義したエラー(E_USER_WARNINGほど重要でない )を出力 |
E_USER_DEPRECATED(16384) | 独自に定義した非推奨機能の警告メッセージを出力 |
E_CORE_ERROR(16) | PHPのコア部分に起因するエラーを出力 |
E_CORE_WARNING(32) | PHPのコア部分に起因する問題(E_CORE_ERRORほど致命的でない)を出力 |
E_COMPILE_ERROR(64) | コンパイル処理に起因する致命的なエラーを出力 |
E_COMPILE_WARNING(128) | コンパイル処理に起因する問題(E_COMPILE_ERROR ほど致命的でない)を出力 |
E_DEPRECATED(8192) | 今後動作しなくなる可能性があるコードについて警告するメッセージを出力 |
E_STRICT(2048) | 互換性を維持するためにコードを変更する旨を出力 |
E_RECOVERABLE_ERROR(4096) | キャッチできる致命的なエラーを出力 |
E_ALL(32767) | すべてのエラーを出力 |
一般的なエラーメッセージ
はじめに、PHPにおいて一般的なエラーメッセージについて、以下の4つを紹介します。
- ・E_ERROR
- ・E_PARSE
- ・E_WARNING
- ・E_NOTICE
E_ERROR
E_ERRORを設定すると、プログラムの続行が不可能になる致命的なエラーが出力されます。E_ERRORに該当するエラーメッセージが出力された場合、プログラムの実行が中断されることから、原因を特定し修正しなければなりません。
以下は、E_ERRORのエラーメッセージを出力するサンプルコードです。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
<?php /** * Fatal errorの例 * 呼び出し時の引数が定義されているものより少ないため、以下のエラーが出力される * * PHP Fatal error: Uncaught ArgumentCountError: Too few arguments to function calc_plus(), */ // calc_plusの引数は2つ function calc_plus($arg1, $arg2) { return $arg1 + $arg2; } $value1 = 2; $value2 = 4; // calc_plusを引数1つで呼び出している echo $value1."+".$value2."=".calc_plus($value1); |
E_PARSE
E_PARSEを設定すると、PHPの文法エラーが出力されます。E_ERRORと同様に、エラーが発生するとプログラムの実行が中断されるため、ソースコードの修正が必要です。
以下は、E_PARSEのエラーメッセージを出力するサンプルコードです。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
/** * Parse errorの例 * セミコロンが抜けているため、以下のエラーが出力される * * PHP Parse error: syntax error, unexpected variable "$value2" */ function calc_plus($arg1, $arg2) { return $arg1 + $arg2; } $value1 = 2 // セミコロンが抜けている $value2 = 4; echo $value1."+".$value2."=".calc_plus($value1, $value2); |
E_WARNING
E_WARNINGを設定すると、警告メッセージが出力されます。E_ERRORとは違い、発生してもプログラムは続行されるのがポイントです。しかし、ソースコードに問題があることに変わりはないため、然るべき修正を施すのが無難です。
以下は、E_WARNINGのメッセージを出力するサンプルコードです。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
<?PHP /** * Warningの例 * 未定義の変数を参照しようとしているため、警告メッセージが出力される * * PHP Warning: Undefined variable $value2 */ $value1 = 1; // 未定義の変数value2を参照しようとしている $value3 = $value1 + $value2; // 処理は継続され「1」が表示される echo $value3; |
E_NOTICE
E_NOTICEを設定すると、注意メッセージが出力されます。E_WARNINGと同様に、発生してもプログラムが中断することはありません。E_WARNINGと比較すると深刻度は低いですが、正しい書き方を理解するためにも、修正しておくのが無難です。
以下は、E_NOTICEのメッセージを出力するサンプルコードです。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
/** * Noticeの例 * クラスの静的プロパティをインスタンス経由で参照しようとしているため、注意メッセージが出力される * * PHP Notice: Accessing static property SampleClass::$prop1 as non static */ class SampleClass { public static $prop1 = "prop1"; } $ins = new SampleClass(); // インスタンスから静的プロパティを参照している echo $ins->prop1; // 静的プロパティへの参照は以下のように書くのが理想 echo SampleClass::$prop1; |
独自に定義したエラーメッセージ
PHPでは、デフォルトで用意されているエラーメッセージの他に、開発者が独自にエラーメッセージを定義できます。ここでは、開発者が独自に定義したエラーメッセージについて、以下の4つを紹介します。
- ・E_USER_ERROR
- ・E_USER_WARNING
- ・E_USER_NOTICE
- ・E_USER_DEPRECATED
E_USER_ERROR
E_USER_ERRORは、trigger_error関数で定義したE_ERRORに相当するエラーメッセージを出力します。E_ERRORと同様に、プログラムの実行が中断されるため、原因を突き止めコードを修正することが肝要です。
1 2 3 4 5 6 7 |
<?php /** * 以下のように設定した場合に出力されるエラーメッセージ * * PHP Fatal error: エラーを検出したためプログラムを中断します */ trigger_error ( "エラーを検出したためプログラムを中断します" , E_USER_ERROR ); |
E_USER_WARNING
E_USER_WARNINGは、trigger_error関数で定義したE_WARNINGに相当する警告メッセージを出力します。E_USER_ERRORと違い、プログラムは続行されます。開発者に対して、問題のある動作が起きていることを知らせるために設定します。
1 2 3 4 5 6 7 |
<?php /** * 以下のように設定した場合に出力されるエラーメッセージ * * PHP Warning: 警告:問題のある動作を検出しました */ trigger_error ( "警告:問題のある動作を検出しました" , E_USER_WARNING ); |
E_USER_NOTICE
E_USER_NOTICEは、trigger_error関数で定義したE_NOTICEに相当する注意メッセージを出力します。E_USER_WARNINGと同様に、プログラムは続行されます。E_USER_WARNINGほど問題ではないが、注意すべき旨を開発者に促すのに最適です。
1 2 3 4 5 6 7 |
<?php /** * 以下のように設定した場合に出力されるメッセージ * * PHP Notice: 注意:問題の起こりうる動作を検出しました */ trigger_error ( "注意:問題の起こりうる動作を検出しました" , E_USER_NOTICE ); |
E_USER_DEPRECATED
E_USER_DEPRECATEDは、trigger_error関数で定義した非推奨機能に関するメッセージを出力します。今後プログラムを改善する際に廃止予定の機能を呼び出したときに、非推奨の旨を出力させることで、開発者にソースコードの修正を促せるのがポイントです。
1 2 3 4 5 6 7 |
<?php /** * 以下のように設定した場合に出力されるメッセージ * * PHP Deprecated: 次回アップデートの際に廃止予定です */ trigger_error ( "次回アップデートの際に廃止予定です" , E_USER_DEPRECATED ); |
その他のエラーメッセージ
E_CORE_ERROR・E_CORE_WARNING
E_CORE_ERROR・E_CORE_WARNINGは、いずれもPHPの初回起動時に発生するエラー・警告メッセージを出力します。PHPのコア部分に起因するため、PHPを正常にインストールしていれば、出力されることはありません。
E_COMPILE_ERROR・E_COMPILE_WARNING
E_COMPILE_ERROR・E_COMPILE_WARNINGは、いずれもPHPのコンパイル時に発生するエラー・警告メッセージを出力します。PHPの構文解析プログラムのZend Engineに起因するもののため、Zend Engineに不具合がなければメッセージが出力することはありありません。
E_DEPRECATED
E_DEPRECATEDは、今後廃止される可能性のあるPHPの諸機能を利用した際に、推奨されない旨のメッセージを出力します。
以下のサンプルコードは、PHP8.0においてE_DEPRECATEDに該当するメッセージが出力されるものの一例です。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
<?php /** * E_DEPRECATEDの例(PHP8.0) * * 関数の第一引数はデフォルト引数で、第二引数以降が必須の引数の場合、 * 以下のメッセージが出力されます。 * * PHP Deprecated: Required parameter $val2 follows optional parameter $val1 */ // 下記の書き方だと、デフォルト引数を利用する意味がない function calc_plus($val1 = 0, $val2) { return $val1 + $val2; } |
E_STRICT
E_STRICTは、PHPのバージョンが変わることによる互換性を維持するために、ソースコードの変更を促すメッセージを出力します。PHP5.6からPHP7.0にバージョンアップした際に、E_STRICTに該当するメッセージは他のエラーとして取り扱うようになったため、E_STRICTのメッセージが出力されることはありません。
E_RECOVERABLE_ERROR
E_RECOVERABLE_ERRORは、E_ERRORに相当する致命的なエラーの中でも、キャッチすることでプログラムの続行が可能なものを出力します。
E_ALL
E_ALLは、今まで紹介したメッセージをすべて出力します。
error_reportingの設定方法
error_reportingを設定する方法は、以下の3種類があります。
- ・php.iniを編集する方法
- ・error_reporting関数を呼び出す方法
- ・ini_set関数を呼び出す方法
php.iniを編集する方法
1つ目は、php.iniを直接編集する方法です。編集対象のphp.iniによって動作するすべてのPHPアプリケーションに適用されます。
error_reporting関数を呼び出す方法
2つ目は、PHPのプログラム内でerror_reporting関数を呼び出す方法です。error_reporting関数を呼び出した場合は、php.iniよりも優先して適用されます。引数・戻り値は以下の通りです。
引数 | エラー定数、または対応する整数値 |
戻り値 | 現在設定されているエラー定数(整数値) |
以下は、error_reporting関数を利用したエラー出力設定の一例です。
1 2 3 4 5 6 7 |
<?php // E_ERRORを設定する場合の記述例 error_reporting(E_ERROR); // 戻り値は現在設定されているエラー定数に対応した整数値のため「1」と表示される echo error_reporting(); |
1 2 3 4 5 6 7 |
<?php // E_PARSEに対応する整数値「4」を設定 error_reporting(4); // 「4(E_PARSEの整数値)」と表示される echo error_reporting(); |
ini_set関数を呼び出す方法
3つ目は、PHPのプログラム内でini_set関数を呼び出す方法です。error_reporting関数と同様に、呼び出されたらphp.iniよりも優先して適用されます。引数・戻り値は以下の通りです。
引数 | 第1引数 | 設定項目(’error_reporting’を設定) |
第2引数 | エラー定数または対応する整数値 | |
戻り値 | 設定が成功した場合:True 失敗した場合:False |
以下は、ini_set関数を利用したエラー出力設定の一例です。
1 2 3 4 5 6 7 |
<?php // E_WARNINGを設定する場合の記述例 ini_set('error_reporting', E_WARNING); // 「2(E_WARNINGの整数値)」と表示される echo error_reporting(); |
1 2 3 4 5 6 7 |
<?php // E_NOTICE対応する整数値「8」を設定 ini_set('error_reporting', 8); // 「8(E_NOTICEの整数値)」と表示される echo error_reporting(); |
エラーの種類を複数設定する方法
エラーの種類を複数設定したい場合は、ビット演算子を利用することで簡単に設定できます。以下に、ビット演算子を利用したエラー設定のサンプルコードを載せているので、ぜひ参考にしてください。
1 2 3 |
; E_ERROR・E_PARSE・E_WARNINGの3つを設定したい場合 ; →ビット演算子の「|(論理和)」を利用して、以下のように設定。 error_reporting = E_ERROR | E_PARSE | E_WARNING |
1 2 3 |
; E_NOTICEのみ設定から除外したい場合 ; →ビット演算子の「&(論理積)」「~(否定)」を利用して、以下のように設定。 error_reporting = E_ALL & ~E_NOTICE |
まとめ
いかがでしたか? 今回は、
について解説しました。
error_reportingを上手に使いこなすためには、PHPのエラーの種類を把握することが重要です。そのうえで、どのエラーを出力すべきかを考えながら設定するようにしましょう。