【PHP8.x】lineプロパティの使い方

lineプロパティの使い方について、初心者にもわかりやすく解説します。

作成日: 更新日:

基本的な使い方

lineプロパティは、ArithmeticErrorクラスのインスタンスにおいて、エラーが発生したソースコードの行番号を保持するプロパティです。

ArithmeticErrorクラスは、PHPで算術演算に関するエラーが発生した場合にスローされるエラーの一つです。例えば、intdiv()関数でゼロによる除算を試みた際などに発生します。このエラーオブジェクトが生成されると、lineプロパティには、エラーが実際に発生したPHPスクリプト内の具体的な行番号が自動的に格納されます。

このプロパティは、PHPのエラーや例外の基底となるThrowableインターフェース(およびその子孫であるErrorクラス)によって提供される共通のプロパティであり、あらゆる種類のエラーや例外オブジェクトで利用できます。エラー発生時のデバッグ作業において、エラーがどのファイル、どの行で発生したかを特定することは非常に重要であり、このlineプロパティはそのための不可欠な情報を提供します。

開発者は、try-catchブロックを使用してArithmeticErrorを捕捉し、そのオブジェクトからlineプロパティの値を取得することで、エラーの原因を迅速に特定し、適切なエラー処理やログ記録を行うことができます。このプロパティは読み取り専用であり、エラーオブジェクトが一度生成された後はその値を変更することはできません。

構文(syntax)

1<?php
2
3try {
4    // この行で DivisionByZeroError (ArithmeticError の子クラス) がスローされる
5    $result = 10 / 0;
6} catch (ArithmeticError $e) {
7    echo $e->line;
8}

引数(parameters)

引数なし

引数はありません

戻り値(return)

int

ArithmeticError クラスの line プロパティは、エラーが発生したソースコードの行番号を整数で返します。

サンプルコード

PHP ArithmeticErrorの発生行番号を取得・送信する

1<?php
2
3/**
4 * 算術エラーを意図的に発生させ、
5 * エラーが発生した行番号をログに送信(記録)するサンプル関数です。
6 */
7function sendErrorLineNumber(): void
8{
9    try {
10        // この行で ArithmeticError が発生します。
11        // PHP 8以降、負の数によるビットシフトは ArithmeticError をスローします。
12        $result = 1 << -1;
13
14        // エラーが発生した場合、この行以降は実行されません。
15        echo "処理は正常に完了しました。" . PHP_EOL;
16
17    } catch (ArithmeticError $e) {
18        // ArithmeticError 例外をキャッチします。
19
20        // 例外オブジェクトからエラーが発生した行番号を取得します。
21        // これはリファレンス情報の `line` プロパティに相当します。
22        $errorLine = $e->getLine();
23        $errorMessage = $e->getMessage();
24        $errorFile = $e->getFile();
25
26        // 取得した行番号を含むエラー情報を整形します。
27        $logMessage = sprintf(
28            "エラーが発生しました。 [ファイル: %s] [行番号: %d] [メッセージ: %s]",
29            $errorFile,
30            $errorLine,
31            $errorMessage
32        );
33
34        // 整形したエラーメッセージをサーバーのログファイルに「送信」(記録)します。
35        // 実際のアプリケーションでは、この情報を監視システムなどに送信することもあります。
36        error_log($logMessage);
37
38        // ユーザー向けに、エラーが発生したことと、その行番号を画面に表示します。
39        echo "致命的なエラーが発生したため、処理を中断しました。" . PHP_EOL;
40        echo "エラーが発生した行番号: " . $errorLine . PHP_EOL;
41        echo "詳細はサーバーログを確認してください。" . PHP_EOL;
42    }
43}
44
45// 作成した関数を実行します。
46sendErrorLineNumber();

このPHPサンプルコードは、計算エラー(ArithmeticError)が発生した際に、そのエラーがどのファイルの何行目で起きたかを示す行番号を取得し、その情報をログに「送信」(記録)する方法を示します。

コードでは、まずtryブロック内で意図的に算術エラーを発生させています。PHP 8以降、負の数によるビットシフト演算(1 << -1)はArithmeticErrorを引き起こします。

次にcatchブロックで、発生したArithmeticErrorの例外オブジェクト$eを捕捉します。このオブジェクトが持つgetLine()メソッドを呼び出すことで、エラーが発生したソースコードの行番号を取得できます。リファレンスにあるlineプロパティは、このgetLine()メソッドによって返される値です。このメソッドは引数を取らず、戻り値として行番号を整数(int)で返します。

取得した行番号は、ファイル名やエラーメッセージと共に整形され、error_log()関数によってサーバーのログファイルに記録されます。これにより、開発者はエラーの発生箇所を正確に特定できます。最後に、利用者向けにもエラーが発生した旨と行番号を画面に表示しています。

このコードは、try...catch構文でプログラムのエラーを捉える方法を示しています。注意点として、$e->getLine()で取得できるのはエラーが実際に発生した行の番号であり、catchブロック内の行ではないことを理解してください。このサンプルはPHP 8以降で動作し、古いバージョンでは意図通りにエラーが発生しない可能性があります。また、error_log関数は通常サーバーのファイルに情報を記録するもので、外部への「送信」には専用のライブラリなどが必要です。ユーザーに詳細なエラー情報を画面表示するのは開発時のみに留め、公開するアプリケーションではセキュリティ上、避けるべきです。

関連コンテンツ