【PHP8.x】InvalidArgumentException::getLine()メソッドの使い方
getLineメソッドの使い方について、初心者にもわかりやすく解説します。
基本的な使い方
『getLineメソッドは、例外がスローされたソースコードの行番号を取得するメソッドです』
このメソッドは、InvalidArgumentExceptionクラスが直接持つものではなく、その親クラスであるExceptionクラスから継承された機能です。InvalidArgumentExceptionは、関数やメソッドに渡された引数の型や値が期待されるものと異なっている、といった不正な引数が原因で発生する例外です。プログラムの実行中にこの例外が発生し、try-catch構文で捕捉された際、その例外オブジェクトに対してgetLine()メソッドを呼び出すことで、例外がどのファイルの何行目で発生したのかを正確に特定できます。この行番号情報は、エラーの原因箇所を迅速に突き止め、修正作業を行うデバッグの過程において極めて重要です。返り値は行番号を示す整数(int)となります。一般的には、例外が発生したファイル名を取得するgetFile()メソッドと組み合わせて、エラーログなどに出力するために使用されます。
構文(syntax)
1<?php 2 3function processUserInput(string $name) 4{ 5 if (empty($name)) { 6 // InvalidArgumentExceptionをスローする 7 throw new InvalidArgumentException('名前は空にできません。'); 8 } 9 // ...処理... 10} 11 12try { 13 processUserInput(''); 14} catch (InvalidArgumentException $e) { 15 // final public getLine(): int 16 $errorLine = $e->getLine(); 17 18 echo "エラーが発生した行番号: " . $errorLine; 19}
引数(parameters)
引数なし
引数はありません
戻り値(return)
int
このメソッドは、例外が発生したソースコードの行番号を整数で返します。
サンプルコード
PHP例外でエラー発生行を取得する
1<?php 2 3declare(strict_types=1); 4 5/** 6 * ユーザー登録を行う関数(シミュレーション) 7 * 8 * @param string $username ユーザー名 9 * @param int $age 年齢 10 * @return string 登録成功メッセージ 11 * @throws InvalidArgumentException 引数が不正な場合にスローされる 12 */ 13function registerUser(string $username, int $age): string 14{ 15 // 年齢が18歳未満の場合、不正な引数として例外をスローする 16 if ($age < 18) { 17 // この行で例外がインスタンス化され、スローされる 18 throw new InvalidArgumentException('年齢は18歳以上である必要があります。'); 19 } 20 21 return "ユーザー '{$username}' ({$age}歳) の登録が完了しました。"; 22} 23 24try { 25 // わざと不正な年齢(15歳)を引数に渡して関数を呼び出す 26 $message = registerUser('Taro', 15); 27 echo $message; 28} catch (InvalidArgumentException $e) { 29 // スローされた例外をキャッチする 30 echo "エラーが発生しました。\n"; 31 echo "メッセージ: " . $e->getMessage() . "\n"; 32 33 // getLine()メソッドを使い、例外がスローされたソースコードの行番号を取得して表示する 34 // この例では、registerUser関数内の `throw` 文がある行の番号が出力される 35 echo "エラー発生行: " . $e->getLine() . "行目\n"; 36}
PHPのInvalidArgumentExceptionクラスに属するgetLineメソッドについて解説します。このメソッドは、プログラムの実行中に例外(エラー)が発生した際、その原因となったソースコードの行番号を取得するために使用します。引数はなく、戻り値として行番号を整数で返します。
サンプルコードでは、ユーザー登録を模したregisterUser関数が定義されています。この関数は、引数として受け取った年齢が18歳未満の場合に、引数が不正であることを示すInvalidArgumentExceptionをスロー(発生)させます。
プログラムの実行部分では、tryブロックの中で意図的に15歳という不正な値をregisterUser関数に渡しています。これにより関数内で例外が発生し、処理は直ちにcatchブロックに移ります。
catchブロックでは、発生した例外オブジェクト(変数$e)を受け取ります。そして、$e->getLine()を呼び出すことで、例外がスローされた具体的な行番号、つまりregisterUser関数内のthrow文が書かれている行の番号を取得し、画面に表示しています。このようにgetLineメソッドは、エラー発生箇所を特定するデバッグ作業において非常に役立ちます。
getLine()メソッドは、例外をcatchした場所ではなく、例外がthrowされた場所の行番号を返します。このサンプルではregisterUser関数内のthrow文がある行が該当します。この機能は、開発中のデバッグ作業でエラーの発生箇所を素早く特定するために非常に役立ちます。ただし、本番環境でユーザーにエラー行番号をそのまま表示すると、システムの内部構造が推測されるセキュリティリスクに繋がる可能性があります。そのため、ユーザーには汎用的なエラーメッセージを見せ、getLine()で取得した詳細な情報はログファイルに記録するのが一般的です。このメソッドはExceptionクラスの基本的な機能であり、他の種類の例外でも同様に利用できます。