【PHP8.x】error_get_last関数の使い方

作成日: 更新日:

error_get_last関数は、PHPスクリプトの実行中に最後に発生したエラーに関する情報を取得する関数です。この関数は、プログラムが予期せぬ動作をした際に、PHPが内部的に記録した最新のエラーについて、その詳細情報を提供します。

返される情報は連想配列の形式です。この連想配列には、エラーの種類を示す 'type'、具体的なエラーメッセージを示す 'message'、エラーが発生したファイル名を示す 'file'、そしてエラーが発生したコードの行番号を示す 'line' といったキーが含まれています。これにより、どのファイルで何が原因でエラーが発生したのかを具体的に把握することができます。

もし、スクリプトの実行中にこれまでにエラーが全く発生していない場合は、この関数はnullを返します。そのため、戻り値がnullかどうかを確認することで、エラーが発生したかどうかを判断できます。

この関数は、特にエラーハンドリングの仕組みを独自に設定していない場合や、PHPのシステムが記録した最新のエラー状況を迅速に確認したい場合に有効です。ただし、一度に複数のエラーが発生した場合でも、直前に発生した単一のエラーの情報しか取得できない点にご注意ください。デバッグ作業や問題解決のために、最後に発生したエラーの原因を特定する上で非常に役立つ関数です。

基本的な使い方

構文(syntax)

<?php
error_get_last();
?>

引数(parameters)

引数なし

引数はありません

戻り値(return)

?array

直近で発生したPHPのエラー情報を連想配列で取得します。エラーが発生していない場合は null を返します。

サンプルコード

error_get_last() でエラーを取得する

<?php

/**
 * error_get_last() の戻り値を確認する関数
 *
 * この関数は、エラーが発生していない場合と発生した場合とで、
 * error_get_last() の戻り値がどのように変化するかを示します。
 */
function demonstrateGetLastError(): void
{
    // --- 1. エラーが発生していない状況 ---
    // スクリプト実行後、まだエラーが発生していないため、error_get_last() は null を返します。
    // キーワード「php error_get_last return null」はこの状態を指します。
    echo "--- 実行開始直後 ---" . PHP_EOL;
    $error = error_get_last();
    echo '取得したエラー: ';
    var_dump($error); // 出力: NULL
    echo PHP_EOL;

    // --- 2. 意図的にエラー(警告)を発生させる状況 ---
    // 存在しないファイルを読み込もうとして、警告(E_WARNING)を発生させます。
    // '@' 演算子を使うことで、PHPの標準エラー出力を抑制し、
    // スクリプトの実行を継続した上で、エラー情報を後から取得できます。
    echo "--- 存在しないファイルを開こうとした後 ---" . PHP_EOL;
    @file_get_contents('non_existent_file.txt');

    // 直前にエラーが発生したため、error_get_last() はエラー情報を含む配列を返します。
    // 戻り値の型は `?array` であり、null または array を返します。
    $error = error_get_last();
    echo '取得したエラー: ' . PHP_EOL;
    print_r($error);
}

// 関数を実行して動作を確認します。
demonstrateGetLastError();

?>

error_get_last関数は、PHPスクリプトの実行中に最後に発生したエラーに関する情報を取得するために利用されます。この関数は引数をとりません。戻り値は、最後に発生したエラーの詳細を格納した配列か、あるいはエラーがまだ一度も発生していない場合にnullとなります。この戻り値の型は?arrayと表記され、配列またはnullのどちらかであることを示しています。

サンプルコードでは、まずスクリプトの実行開始直後にerror_get_last()を呼び出しています。この時点ではエラーが発生していないため、戻り値はnullとなり、「php error_get_last return null」というキーワードの状況を確認できます。

次に、存在しないファイルを読み込もうとすることで、意図的に警告(E_WARNING)を発生させています。ここでファイル操作の前に記述されている@演算子は、PHPが通常出力するエラーメッセージを一時的に抑制し、スクリプトの実行を継続させる役割があります。

警告が発生した直後に再度error_get_last()を呼び出すと、今度は直前に発生した警告の詳細(エラーの種類、メッセージ、発生ファイル、行番号など)が格納された配列が戻り値として取得されます。このように、error_get_last()はエラー発生の有無に応じてnullまたはエラー情報配列を返すため、スクリプトのエラー状況をプログラムで確認する際に役立ちます。

error_get_last()関数は、最後に発生したエラー情報を取得しますが、エラーが一度も発生していない場合はnullを返します。そのため、戻り値が常に配列であると想定せず、必ずnullでないことを確認してから配列の要素にアクセスするようにしてください。nullの状態で配列として扱おうとすると、新たなエラーが発生してしまいます。また、この関数で取得できるのは直前のエラー1件のみです。サンプルコードにある@演算子は、画面へのエラー表示を抑制しますが、エラー自体は記録されるため、後からこの関数で内容を確認できます。スクリプトの実行が停止するような致命的なエラーは、この関数で捕捉する前に処理が終了してしまう点にも注意が必要です。

PHP error_get_last でエラータイプを取得する

<?php

// PHP 8 の推奨コーディングスタイルに従います。

/**
 * PHPのerror_get_last関数を使用して、直近のPHPエラー情報を取得し表示するサンプルコードです。
 * システムエンジニアを目指す初心者の方にも、エラー情報に含まれる「タイプ」の意味がわかるように説明します。
 */
function demonstrateErrorGetLastUsage(): void
{
    // PHPのエラー報告レベルを設定します。
    // E_ALL は全てのPHPエラー、警告、通知などを報告するようにします。
    // ini_set('display_errors', '1') は、エラーメッセージをブラウザ(またはCLI)に出力する設定です。
    // 開発時にはこれらの設定を有効にすることが推奨されます。
    error_reporting(E_ALL);
    ini_set('display_errors', '1');

    echo "--- 1. エラーを発生させる前 (通常はnull) ---\n";
    // error_get_last() は、スクリプト内でまだエラーが発生していない場合、nullを返します。
    $noErrorBefore = error_get_last();
    if ($noErrorBefore === null) {
        echo "  現在、PHPスクリプト内で最後に発生したエラーはありません。\n";
    } else {
        echo "  予期せぬエラー情報が残っています:\n";
        print_r($noErrorBefore);
    }
    echo "\n";

    echo "--- 2. 意図的に E_WARNING を発生させる ---\n";
    // 未定義の変数を参照することで、PHP 8 では E_WARNING (実行時警告) が発生します。
    // この行の実行時に警告が直接出力されますが、スクリプトの実行は停止せず続行されます。
    // この警告が、error_get_last() で取得できる「最後の」エラーとなります。
    $undefinedVariable = $thisVariableDoesNotExist; // ここで E_WARNING が発生します

    echo "\n--- 3. error_get_last() で最後のPHPエラー情報を取得 ---\n";
    // error_get_last() を呼び出し、スクリプト内で最後に発生したPHPエラーの情報を取得します。
    // エラーが発生していない場合は null を返しますが、今回は直前に E_WARNING を発生させました。
    $lastError = error_get_last();

    // 取得したエラー情報が存在するかどうかを確認します。
    // error_get_last() の戻り値は ?array なので、null チェックが重要です。
    if ($lastError !== null) {
        echo "  最後のPHPエラー情報が取得されました:\n";
        echo "    - 'type' (エラータイプ、数値): " . $lastError['type'] . "\n";
        echo "    - 'message' (エラーメッセージ): " . $lastError['message'] . "\n";
        echo "    - 'file' (エラー発生ファイル): " . $lastError['file'] . "\n";
        echo "    - 'line' (エラー発生行番号): " . $lastError['line'] . "\n";

        echo "\n  'type' の値とPHPのエラー定数の比較 (エラータイプの理解を深めるため):\n";
        // 'type' の値は整数であり、PHPの定義済み定数(E_ERROR, E_WARNINGなど)に対応します。
        // これらの定数と比較することで、エラーの具体的な種類をプログラムで判別できます。
        switch ($lastError['type']) {
            case E_ERROR:
                echo "    エラータイプは E_ERROR です: 致命的な実行時エラー。通常、このエラーが発生するとスクリプトは停止します。\n";
                break;
            case E_WARNING:
                echo "    エラータイプは E_WARNING です: 実行時警告。スクリプトの実行は続行されます。\n";
                break;
            case E_PARSE:
                echo "    エラータイプは E_PARSE です: コンパイル時のパースエラー。構文間違いなど。\n";
                break;
            case E_NOTICE:
                echo "    エラータイプは E_NOTICE です: 実行時通知。軽微な問題や推奨事項です。\n";
                break;
            case E_USER_ERROR:
                echo "    エラータイプは E_USER_ERROR です: trigger_error() で発生させたユーザー定義の致命的エラー。\n";
                break;
            case E_USER_WARNING:
                echo "    エラータイプは E_USER_WARNING です: trigger_error() で発生させたユーザー定義の警告。\n";
                break;
            case E_USER_NOTICE:
                echo "    エラータイプは E_USER_NOTICE です: trigger_error() で発生させたユーザー定義の通知。\n";
                break;
            case E_DEPRECATED:
                echo "    エラータイプは E_DEPRECATED です: 非推奨機能の使用。将来のバージョンで削除される可能性があります。\n";
                break;
            case E_USER_DEPRECATED:
                echo "    エラータイプは E_USER_DEPRECATED です: trigger_error() で発生させたユーザー定義の非推奨警告。\n";
                break;
            default:
                echo "    エラータイプは上記のいずれでもありません (数値: " . $lastError['type'] . ")。\n";
                break;
        }
    } else {
        echo "  エラー情報が見つかりませんでした。これは通常、エラーが発生しなかったことを意味します。\n";
    }
    echo "\n";
}

// 上記で定義した関数を実行します。
demonstrateErrorGetLastUsage();

?>

PHP 8 の error_get_last 関数は、スクリプト内で最後に発生したPHPエラーの情報を取得する際に使用します。この関数に引数は不要で、エラーが発生していればエラー情報を含む連想配列を、エラーがなければ null を戻り値として返します。

取得される配列には、エラーの種類を示す type、エラーメッセージの message、エラーが発生したファイル名の file、行番号の line といった重要な情報が含まれます。中でも type は、PHPが定義するエラー定数(例: E_WARNINGE_ERROR)に対応する数値であり、エラーの具体的な種類を示します。例えば、サンプルコードのように未定義の変数を参照すると E_WARNING(実行時警告)が発生しますが、これはスクリプトの実行を停止させません。一方、E_ERROR は致命的なエラーでスクリプトは停止します。type の値を確認することで、エラーの深刻度や種類をプログラムで判断し、適切な対応を行うことが可能です。この関数は、デバッグ作業や独自のエラーハンドリングシステムを構築する際に非常に役立ちます。

error_get_last()は直近のエラー情報を取得する関数です。スクリプト内でエラーが発生していない場合はnullを返すため、必ずnullチェックを行いましょう。戻り値はnullable array (?array)である点に注意が必要です。

エラーのtypeは整数値で、E_ERRORE_WARNINGといったPHP定義済みの定数に対応します。これらの定数と比較することで、エラーの種類を判別できます。

error_reporting(E_ALL)ini_set('display_errors', '1')は開発時に有効にすることを推奨します。本番環境ではエラー情報を公開しないように設定を見直してください。意図しない情報漏洩を防ぐため、エラーログを適切に管理することも重要です。

【PHP8.x】error_get_last関数の使い方 | いっしー@Webエンジニア