【PHP8.x】LogicException::lineプロパティの使い方
lineプロパティの使い方について、初心者にもわかりやすく解説します。
基本的な使い方
lineプロパティは、例外がスローされたソースコードの行番号を保持するプロパティです。このプロパティは、PHPの基本的な例外クラスであるExceptionクラスで定義されており、LogicExceptionクラスはそれを継承して利用します。プログラムの実行中に、設計上の誤りや矛盾といった論理的なエラーが発生してLogicExceptionがスローされると、PHPエンジンはその例外が発生した時点での行番号を自動的にこのプロパティに設定します。この情報は、開発者がエラーの原因を特定する上で非常に重要であり、デバッグ作業を迅速かつ正確に進めるために不可欠です。ただし、lineプロパティはprotectedとして宣言されているため、オブジェクトの外部から直接アクセスすることはできません。この値を取得するためには、公開されているgetLine()メソッドを使用する必要があります。try...catchブロックで例外オブジェクトを捕捉し、そのオブジェクトに対してgetLine()メソッドを呼び出すことで、エラーが発生した具体的な行番号を取得できます。
構文(syntax)
1<?php 2 3try { 4 // この行で LogicException を意図的にスローします 5 throw new LogicException("これはテスト用のロジックエラーです。"); 6} catch (LogicException $e) { 7 // 捕捉した例外オブジェクトの getLine() メソッドを使い、 8 // 例外がスローされた行番号を取得して表示します。 9 // $e->line プロパティは protected のため、通常はこのメソッド経由でアクセスします。 10 echo "エラーが発生した行番号: " . $e->getLine(); 11}
引数(parameters)
引数なし
引数はありません
戻り値(return)
int
このプロパティは、例外が発生したソースコードの行番号を整数型で返します。
サンプルコード
PHP LogicExceptionの発生行をログ送信する
1<?php 2 3declare(strict_types=1); 4 5/** 6 * 補足した例外情報からエラー発生行番号を取得し、ログに送信(記録)する関数 7 * 8 * @param LogicException $e 補足した LogicException オブジェクト 9 * @return void 10 */ 11function sendErrorLine(LogicException $e): void 12{ 13 // LogicException オブジェクトから、例外がスローされた行番号を取得します。 14 // $e->getLine() は、Exceptionクラスから継承したメソッドです。 15 $errorLine = $e->getLine(); 16 17 // 例外が発生したファイル名とエラーメッセージも取得します。 18 $errorFile = $e->getFile(); 19 $errorMessage = $e->getMessage(); 20 21 // ログに送信するメッセージを組み立てます。 22 $logMessage = sprintf( 23 "論理エラーが発生しました: [ファイル: %s] [行番号: %d] [メッセージ: %s]", 24 $errorFile, 25 $errorLine, 26 $errorMessage 27 ); 28 29 // 組み立てたメッセージをPHPのエラーログに送信(記録)します。 30 // 実際のアプリケーションでは、この部分をメール送信やSlack通知などに置き換えることがあります。 31 error_log($logMessage); 32 33 echo "エラー情報をログに送信しました。サーバーのログファイルを確認してください。\n"; 34} 35 36// メインの処理ブロック 37try { 38 // プログラムのロジックとして矛盾が生じる状況をシミュレートします。 39 // 例えば、計算前に必要な値がセットされていないなど。 40 $price = null; 41 42 if ($price === null) { 43 // この行で LogicException がスローされます。 44 // sendErrorLine()関数内では、この行の番号が取得されます。 45 throw new LogicException('価格が設定されていません。'); 46 } 47 48 // 本来ここで行うはずだった処理 49 // echo "価格は: " . $price . "円です。\n"; 50 51} catch (LogicException $e) { 52 // tryブロック内でスローされた LogicException を補足します。 53 // エラー情報を引数として渡し、ログ送信関数を呼び出します。 54 sendErrorLine($e); 55} 56 57?>
このPHPサンプルコードは、プログラムの論理的な矛盾によって発生するLogicExceptionを捕捉し、エラーが発生した行番号などの情報をログに送信(記録)する方法を示しています。
LogicExceptionクラスは、親のExceptionクラスからgetLine()メソッドを継承しています。このメソッドは引数を取らず、例外がスローされたソースコードの行番号を整数(int)で返します。リファレンス情報にあるlineプロパティは、このメソッドを通じてアクセスされる値です。
コードでは、まずtryブロック内で意図的にthrow new LogicException()によって例外を発生させています。catchブロックでこの例外オブジェクトを捕捉し、sendErrorLine()関数に引数として渡します。
sendErrorLine()関数内では、受け取った例外オブジェクト$eに対して$e->getLine()を実行し、エラーが発生した行番号を取得します。同様にgetFile()でファイル名、getMessage()でエラーメッセージも取得し、これらの情報を組み合わせてログメッセージを作成します。最後にerror_log()関数を使い、作成したメッセージをサーバーのエラーログに送信(記録)しています。これにより、いつ、どこで、どのような論理エラーが発生したかを正確に追跡できます。
getLine()メソッドは、例外が throw された行の番号を取得します。このメソッドはLogicExceptionだけでなく、PHPの基本的な例外クラスであるExceptionから継承されているため、他の種類の例外をcatchした場合でも同様に使用できます。try-catch構文は、tryブロック内で発生した例外のみを捕捉することに注意してください。error_log()関数で出力されるログの保存場所はサーバーの設定に依存するため、php.iniなどで確認が必要です。実際の開発では、より詳細な情報を記録できる専門のロギングライブラリを利用することが一般的です。
PHP LogicExceptionの発生行を取得する
1<?php 2 3/** 4 * ユーザーデータを検証し、ロジックに問題があれば例外をスローします。 5 * 6 * このサンプルでは、LogicExceptionを意図的に発生させ、 7 * catchブロックでその例外オブジェクトのプロパティ(lineなど)にアクセスする方法を示します。 8 * lineプロパティは、例外がスローされた行番号を保持しており、getLine()メソッドで取得できます。 9 * 10 * @param array{name: string, email: string} $userData 検証するユーザーデータ 11 * @return void 12 * @throws LogicException データがロジック上不正な場合にスローされる 13 */ 14function processUserData(array $userData): void 15{ 16 // ユーザー名が空文字列であれば、プログラムのロジックとして矛盾しているとみなす 17 if ($userData['name'] === '') { 18 // LogicExceptionをスローする。この行の番号が getLine() で取得される 19 throw new LogicException('ユーザー名が空です。処理を続行できません。'); 20 } 21 22 echo "ようこそ、{$userData['name']} さん!" . PHP_EOL; 23} 24 25// メインの処理部分 26try { 27 // 正常なデータで関数を呼び出す 28 processUserData(['name' => 'Taro Yamada', 'email' => 'taro@example.com']); 29 30 // 意図的に例外を発生させるデータで関数を呼び出す 31 processUserData(['name' => '', 'email' => 'jiro@example.com']); 32 33} catch (LogicException $e) { 34 // LogicExceptionを捕捉し、エラー情報を表示する 35 echo "----------------------------------------" . PHP_EOL; 36 echo "ロジックエラーを検知しました。" . PHP_EOL; 37 38 // getFile() で例外が発生したファイル名を取得 39 echo "ファイル: " . $e->getFile() . PHP_EOL; 40 41 // getLine() で例外が発生した行番号を取得 (lineプロパティの値) 42 echo "発生行: " . $e->getLine() . "行目" . PHP_EOL; 43 44 // getMessage() で例外メッセージを取得 45 echo "メッセージ: " . $e->getMessage() . PHP_EOL; 46 echo "----------------------------------------" . PHP_EOL; 47} 48
このPHPサンプルコードは、プログラムのロジックに問題がある場合に発生するLogicExceptionという例外を捕捉し、そのエラー情報を表示する方法を解説します。
processUserData関数は、引数で受け取ったユーザーデータの配列を検証します。もしユーザー名が空文字列であれば、プログラムの設計上ありえない矛盾としてLogicExceptionをスロー(発生)させます。throwが実行されると、その時点で関数の処理は中断されます。
メインの処理ではtry...catch構文を使用しています。tryブロック内で関数を実行し、もしLogicExceptionが発生するとcatchブロックがそれを捕捉します。捕捉した例外はオブジェクトとして変数$eに格納されます。
$e->getLine()メソッドを呼び出すと、例外がthrowされたソースコードの行番号を整数(int)で返します。このメソッドは、LogicExceptionオブジェクトが内部に持っているlineプロパティの値を参照しています。サンプルコードでは、getLine()で得た行番号を、getFile()で取得したファイル名やgetMessage()で取得したエラーメッセージと組み合わせて表示することで、いつ、どこで、どのようなロジックエラーが発生したかを正確に特定でき、デバッグ作業を効率的に進めることができます。
LogicExceptionオブジェクトのlineプロパティは、例外がスローされた行番号を保持しますが、直接アクセスすることはできません。必ずgetLine()メソッドを使って値を取得してください。このメソッドで得られる行番号は、catchブロックの行ではなく、throw文が実行された正確な位置を指すため、エラーの原因特定に役立ちます。LogicExceptionは、プログラムの論理的な誤り、つまり開発者が修正すべきバグを示すために使用します。ユーザーの入力ミスなど実行時に起こりうるエラーとは区別して使い分けることが重要です。適切な例外処理は、予期せぬプログラムの停止を防ぎ、デバッグを効率化するために不可欠です。