【PHP8.x】BadMethodCallException::getLine()メソッドの使い方
getLineメソッドの使い方について、初心者にもわかりやすく解説します。
基本的な使い方
getLineメソッドは、例外がスローされたソースコードの行番号を取得するメソッドです。このメソッドは、PHPの例外処理の基底クラスであるExceptionクラスで定義されており、BadMethodCallExceptionクラスはこれを継承しているため利用可能です。BadMethodCallExceptionは、オブジェクトに存在しないメソッドを呼び出そうとした場合や、コールバックが無効である場合など、不正なメソッド呼び出しが行われた際に発生する論理エラーを示します。プログラムの実行中にこの例外が発生した場合、開発者はtry-catch構文で例外オブジェクトを捕捉し、そのオブジェクトに対してgetLineメソッドを呼び出すことができます。これにより、不正なメソッド呼び出しがコード上の何行目に記述されているかを整数値として正確に取得できます。取得した行番号は、エラーの原因を特定するためのデバッグ作業において極めて重要な情報となります。通常は、例外が発生したファイル名を取得するgetFileメソッドと組み合わせて使用され、エラーログの精度向上や、迅速な問題解決に役立てられます。
構文(syntax)
1final public BadMethodCallException::getLine(): int
引数(parameters)
引数なし
引数はありません
戻り値(return)
int
このメソッドは、例外が発生したソースコードの行番号を整数型で返します。
サンプルコード
PHP BadMethodCallException getLine()で発生行を取得する
1<?php 2 3/** 4 * 存在しないメソッド呼び出しを処理するクラス 5 */ 6class MethodCallHandler 7{ 8 /** 9 * オブジェクトのコンテキストでアクセスできないメソッドが呼び出された場合に、 10 * BadMethodCallException をスローします。 11 * 12 * @param string $name 呼び出されようとしたメソッド名 13 * @param array $arguments メソッドに渡された引数のリスト 14 * @throws BadMethodCallException 常にスローされます 15 */ 16 public function __call(string $name, array $arguments): void 17 { 18 // 呼び出し不可能なメソッドが呼ばれた際に、例外をスローする 19 // getLine() は、この throw 文が書かれている行番号を返す 20 throw new BadMethodCallException("メソッド '{$name}' は存在しません。"); 21 } 22} 23 24try { 25 // インスタンスを生成 26 $handler = new MethodCallHandler(); 27 28 // 存在しないメソッドを呼び出し、__call() メソッドをトリガーする 29 $handler->nonExistentMethod('param1', 'param2'); 30 31} catch (BadMethodCallException $e) { 32 // BadMethodCallException をキャッチする 33 34 // getMessage(): 例外メッセージを取得 35 echo "エラーメッセージ: " . $e->getMessage() . PHP_EOL; 36 37 // getFile(): 例外が発生したファイルパスを取得 38 echo "ファイル: " . $e->getFile() . PHP_EOL; 39 40 // getLine(): 例外がスローされた行番号を取得する 41 echo "発生行: " . $e->getLine() . "行目" . PHP_EOL; 42 43 // getTraceAsString(): スタックトレースを文字列として取得 44 echo "スタックトレース:" . PHP_EOL . $e->getTraceAsString() . PHP_EOL; 45}
BadMethodCallExceptionクラスのgetLine()メソッドは、例外がスローされたソースコードの行番号を取得するために使用します。このメソッドに引数はなく、戻り値として行番号を表す整数(int)を返します。
サンプルコードでは、まずMethodCallHandlerクラスのインスタンスに対して、定義されていないnonExistentMethod()を呼び出しています。すると、PHPのマジックメソッドである__call()が自動的に実行され、その中でBadMethodCallExceptionが意図的にスローされます。
try...catchブロックでこの例外を捕捉し、catchブロック内で$e->getLine()を呼び出すことで、例外がスローされた具体的な行番号を取得できます。この例では、__call()メソッド内のthrow new BadMethodCallException(...)と記述された行の番号が表示されます。
このようにgetMessage()(エラーメッセージ)やgetFile()(ファイル名)と合わせてgetLine()を使用することで、エラーが発生した正確な場所を特定できるため、プログラムの問題解決(デバッグ)に非常に役立ちます。
getLine()メソッドは、例外が作られた場所、つまりthrowが記述された行の番号を返します。初心者が注意すべき点は、エラーの直接的な原因となったコードの行番号ではないという点です。このサンプルコードの場合、存在しないメソッドを呼び出した$handler->nonExistentMethod()の行ではなく、__callメソッド内でthrow new BadMethodCallException(...)と書かれている行の番号が取得されます。この違いを理解することがデバッグの鍵です。エラー発生時のファイル名を取得するgetFile()や、呼び出しの履歴がわかるgetTraceAsString()と組み合わせて使うことで、問題の原因をより正確に特定できます。