【PHP8.x】InvalidArgumentException::lineプロパティの使い方
lineプロパティの使い方について、初心者にもわかりやすく解説します。
基本的な使い方
lineプロパティは、例外がスローされたソースコードの行番号を保持するプロパティです。このプロパティは、InvalidArgumentExceptionクラスが継承している基底のExceptionクラスで定義されています。InvalidArgumentExceptionは、関数の引数に予期しない型の値が渡された場合など、引数が無効であるときに発生する例外です。プログラムの実行中にこの例外がスローされると、PHPエンジンはエラーの原因となったコードが記述されているファイルの行番号を、このlineプロパティに自動的に格納します。この情報はデバッグ作業において非常に重要であり、問題が発生した箇所を迅速に特定するのに役立ちます。通常、このプロパティの値はprotectedであるため直接アクセスせず、try-catchブロックで捕捉した例外オブジェクトのgetLine()メソッドを呼び出すことで取得します。取得した行番号をログに出力するなどして、効率的なエラー解決に繋げることができます。
構文(syntax)
1<?php 2 3try { 4 // この行で例外がスローされます 5 throw new InvalidArgumentException("An error occurred."); 6} catch (InvalidArgumentException $e) { 7 // getLine() メソッドで例外が発生した行番号を取得します 8 $line = $e->getLine(); 9 echo "Exception thrown on line: " . $line; 10}
引数(parameters)
引数なし
引数はありません
戻り値(return)
int
このプロパティは、例外が発生したコード行番号を整数で返します。
サンプルコード
PHP InvalidArgumentException の line プロパティで例外発生行をログ送信する
1<?php 2 3declare(strict_types=1); 4 5/** 6 * 例外が発生した行番号を含むエラー情報をログに送信するサンプル関数。 7 * 8 * @param mixed $value 関数の引数として渡す値 9 * @return void 10 */ 11function processValueAndSendLog(mixed $value): void 12{ 13 try { 14 // 値が整数でない場合に例外を発生させる 15 if (!is_int($value)) { 16 // InvalidArgumentExceptionは、関数の引数が期待される型や値でない場合にスローします。 17 // この例外がスローされた行番号が、後のcatchブロックで取得されます。 18 throw new InvalidArgumentException('引数は整数である必要があります。'); 19 } 20 21 // 正常な場合の処理 22 echo "値 '{$value}' は正常です。" . PHP_EOL; 23 } catch (InvalidArgumentException $e) { 24 // 例外をキャッチし、エラー情報を組み立てる 25 // $e->getLine() メソッドで、例外がスローされた行番号を取得できます。 26 $logMessage = sprintf( 27 "[ERROR] message: %s, file: %s, line: %d", 28 $e->getMessage(), 29 $e->getFile(), 30 $e->getLine() // 例外が発生した行番号を取得 31 ); 32 33 // 組み立てたエラー情報を、error_log関数を使ってログに「送信」します。 34 // 実際のシステムでは、ファイルや外部の監視サービスに送信することが多いです。 35 error_log($logMessage); 36 37 echo "エラー情報がログに送信されました。" . PHP_EOL; 38 echo "送信された情報: " . $logMessage . PHP_EOL; 39 } 40} 41 42// 正常な値(整数)を渡して関数を実行 43processValueAndSendLog(100); 44 45echo "-------------------------" . PHP_EOL; 46 47// 意図的に不正な値(文字列)を渡して、例外を発生させる 48processValueAndSendLog('invalid_value'); 49 50?>
このPHPサンプルコードは、関数の引数が不正な場合に、例外がどこで発生したかを示す行番号を含むエラー情報をログに送信する例です。
InvalidArgumentExceptionは、関数の引数が期待される型や値と異なるときに発生させる例外です。この例外オブジェクトが持つgetLine()メソッドは、例外がプログラムコード内で「スロー(throw)」された箇所の行番号を整数(int)で返します。このメソッドに引数はありません。
コード内のprocessValueAndSendLog関数は、引数が整数でない場合にInvalidArgumentExceptionをスローします。try...catch構文によってこの例外が捕捉されると、catchブロックが実行されます。ここで、例外オブジェクト$eの$e->getLine()を呼び出すことで、例外がスローされた正確な行番号を取得できます。
サンプルでは、取得した行番号を、getMessage()で得られるエラーメッセージやgetFile()で得られるファイル名と組み合わせて、一つのログメッセージを作成しています。そしてerror_log()関数を使い、この詳細なエラー情報をログとして出力(送信)します。これにより、開発者はエラーの発生場所を迅速に特定し、デバッグを効率的に進めることができます。
$e->getLine()で取得できる行番号は、例外をcatchした場所ではなく、throwキーワードで例外が投げられた場所の番号である点に注意が必要です。これにより、エラーの根本原因を正確に特定できます。また、error_log関数によるログの出力先は、サーバーの設定に依存し、ファイルや標準エラー出力など様々です。本番環境では、ユーザー画面にエラー詳細を表示せず、このようにログにのみ記録することがセキュリティの観点から推奨されます。getLineやgetMessageといったメソッドは多くの例外クラスで共通して使えるため、一貫性のあるエラーハンドリングが可能です。
PHPでLINE ID検証と例外処理を行う
1<?php 2 3declare(strict_types=1); 4 5/** 6 * LINEのユーザーIDを検証するデモクラス 7 * 8 * このクラスは、InvalidArgumentExceptionとそのプロパティ(line)の使用例を示します。 9 */ 10class LineIdValidator 11{ 12 /** 13 * LINEのユーザーID形式を検証します。 14 * 15 * @param string $userId 検証するユーザーID 16 * @throws InvalidArgumentException ユーザーIDが不正な形式の場合 17 * @return void 18 */ 19 public function validate(string $userId): void 20 { 21 // LINEユーザーIDは 'U' で始まる33文字の英数字という仮定の正規表現 22 if (!preg_match('/^U[a-zA-Z0-9]{32}$/', $userId)) { 23 // 条件に合致しない場合、例外をスローします。 24 // この例外オブジェクトには、スローされた場所の行番号などの情報が含まれます。 25 throw new InvalidArgumentException("無効なLINEユーザーID形式です: {$userId}"); 26 } 27 28 echo "ユーザーID '{$userId}' は有効です。" . PHP_EOL; 29 } 30} 31 32$validator = new LineIdValidator(); 33 34// 不正な形式のユーザーIDを検証し、例外を捕捉する例 35try { 36 // ここでvalidateメソッドを呼び出し、不正な引数を渡します。 37 $validator->validate('invalid-line-user-id'); 38} catch (InvalidArgumentException $e) { 39 // InvalidArgumentException をキャッチします。 40 echo "エラーを捕捉しました。" . PHP_EOL; 41 echo "メッセージ: " . $e->getMessage() . PHP_EOL; 42 43 // getLine() メソッドで、例外がスローされた行番号を取得して表示します。 44 // この場合、LineIdValidatorクラス内の throw new InvalidArgumentException(...) の行を指します。 45 echo "例外の発生行: " . $e->getLine() . "行目" . PHP_EOL; 46 echo "発生ファイル: " . $e->getFile() . PHP_EOL; 47}
このPHPサンプルコードは、関数の引数が不正な値であった場合にスローされるInvalidArgumentExceptionと、その例外が発生した行番号を取得する方法を示しています。
コードでは、LINEのユーザーIDの形式を検証するLineIdValidatorクラスを定義しています。validateメソッドは、引数で受け取ったユーザーIDが想定された形式と異なる場合、throw new InvalidArgumentException(...)によって意図的に例外を発生させます。
プログラムの後半ではtry...catchブロックを使用しています。tryブロック内で不正な形式のIDを渡してvalidateメソッドを呼び出すと、メソッド内で例外が発生します。この発生した例外はcatchブロックで$eという変数に捕捉されます。
この例外オブジェクト$eは、例外に関する情報を持っており、getLine()メソッドを呼び出すことができます。getLine()メソッドは引数を取らず、例外がスローされたコードの行番号を整数(int)で返します。このサンプルでは$e->getLine()を実行することで、validateメソッド内でthrowが記述された具体的な行番号を取得し、エラーメッセージと共に出力しています。このように、エラーの発生箇所を正確に特定するために利用できます。
getLine()メソッドは、例外がthrow(発生)されたソースコードの具体的な行番号を返します。注意点として、この行番号はメソッドを呼び出した場所ではなく、クラス内部で実際にthrow new InvalidArgumentException(...)が実行された行を指します。このtry-catch構文は、不正なデータが渡された際にプログラム全体が停止するのを防ぎ、エラー内容を安全に処理するために不可欠です。InvalidArgumentExceptionは、関数の引数が期待した形式でない場合に、開発者が意図的に発生させるためのものです。getLine()やgetFile()で得られる正確な発生箇所の情報は、エラーの原因を特定するデバッグ作業で非常に役立ちます。