【PHP8.x】getLineメソッドの使い方

getLineメソッドの使い方について、初心者にもわかりやすく解説します。

作成日: 更新日:

基本的な使い方

getLineメソッドは、PHP 8で導入されたUnhandledMatchErrorクラスに属し、マッチ式の網羅されていないケースで発生したエラーの行番号を取得するために使用されるメソッドです。

PHP 8から利用できるようになったmatch式は、従来のswitch文に似ていますが、より厳密な比較と網羅性のチェックを行う点が特徴です。このmatch式を使用する際、考えられるすべての値に対して対応するケース(アーム)を記述しなかった場合、PHPはUnhandledMatchErrorをスローします。これは、予期しないデータが入力された際に、プログラムの実行が停止することを防ぎ、問題の箇所を明確にするためのエラーです。

このUnhandledMatchErrorは、PHPのエラーや例外の基底インターフェースであるThrowableを実装しており、try-catchブロックで捕捉して適切に処理することが可能です。getLineメソッドは、捕捉したUnhandledMatchErrorインスタンスに対して呼び出すことで、そのエラーがPHPスクリプトのどの行で発生したのかを示す整数値を取得することができます。

例えば、エラーログの出力や、開発者が問題の箇所を素早く特定するデバッグ作業において、この行番号の情報は非常に役立ちます。このメソッドは引数を必要とせず、エラー発生元の行番号を直接提供するため、エラーハンドリングのコードを記述する際に、具体的なエラーの原因究明と対処を容易にします。システムエンジニアにとって、エラーの発生箇所を正確に把握することは、安定したシステムを構築し運用するために不可欠な要素です。

構文(syntax)

1<?php
2
3try {
4    $value = 3;
5    $result = match ($value) {
6        1 => 'One',
7        2 => 'Two',
8    };
9} catch (UnhandledMatchError $e) {
10    echo $e->getLine();
11}

引数(parameters)

引数なし

引数はありません

戻り値(return)

int

このメソッドは、エラーが発生したコードの行番号を整数型で返します。

サンプルコード

PHP 8 UnhandledMatchError getLine() を使う

1<?php
2
3declare(strict_types=1);
4
5/**
6 * UnhandledMatchError::getLine() の使用例を示します。
7 *
8 * この関数は、PHP 8 の `match` 式で UnhandledMatchError が発生する状況を意図的に作り出し、
9 * そのエラーをキャッチして UnhandledMatchError::getLine() メソッドを使って
10 * エラーが発生した行番号を取得し表示します。
11 */
12function demonstrateUnhandledMatchErrorGetLine(): void
13{
14    echo "--- UnhandledMatchError::getLine() のデモンストレーション ---\n\n";
15
16    // `match` 式のどのケースにも一致しない値を設定
17    $valueToMatch = 5;
18
19    try {
20        echo "値 '{$valueToMatch}' を使用して `match` 式を実行します。\n";
21        echo "`match` 式に一致するケースがなく、デフォルトもないため UnhandledMatchError が発生します。\n\n";
22
23        // この `match` 式は $valueToMatch (5) に一致するケースがなく、default もないため、
24        // UnhandledMatchError をスローします。
25        // UnhandledMatchError::getLine() はこの行番号を返します。
26        $result = match ($valueToMatch) {
27            1 => 'Value is 1',
28            2 => 'Value is 2',
29            3 => 'Value is 3',
30            // `default` ケースがないため、上記 $valueToMatch = 5 はエラーとなる
31        };
32
33        // 上の行でエラーが発生するため、この行は実行されません。
34        echo "結果: " . $result . "\n";
35
36    } catch (UnhandledMatchError $e) {
37        echo "--- UnhandledMatchError がキャッチされました ---\n";
38        echo "エラーメッセージ: " . $e->getMessage() . "\n";
39
40        // UnhandledMatchError::getLine() を使用して、エラーが発生した行番号を取得
41        $errorLineNumber = $e->getLine();
42        echo "エラーが発生した行番号: " . $errorLineNumber . "\n";
43        echo "(この行番号は、上記の `match` 式が開始された行を示します)\n";
44
45        // 参考情報としてエラーが発生したファイル名も表示
46        echo "エラーが発生したファイル: " . $e->getFile() . "\n";
47
48    } catch (Throwable $e) {
49        // UnhandledMatchError 以外の予期せぬ例外をキャッチする場合
50        echo "--- 予期せぬ例外がキャッチされました ---\n";
51        echo "種類: " . get_class($e) . "\n";
52        echo "メッセージ: " . $e->getMessage() . "\n";
53    }
54
55    echo "\n--- デモンストレーション終了 ---\n";
56}
57
58// 関数を実行して、UnhandledMatchError::getLine() の動作を確認します。
59demonstrateUnhandledMatchErrorGetLine();
60

UnhandledMatchError::getLine()メソッドは、PHP 8で導入されたmatch式を使用する際に、値がどの条件にも一致せず、かつdefault(デフォルト)の処理も指定されていない場合に発生するUnhandledMatchErrorという例外から、エラーが発生したコードの行番号を取得するために用いられます。

このメソッドは引数を一切受け取らず、エラーが発生した行番号を整数(int型)として返します。これにより、プログラムが予期せぬ動作をした際に、具体的にどのコード行で問題が発生したのかを特定し、デバッグ作業を効率的に進めることが可能になります。

サンプルコードでは、match式に一致するケースもdefaultケースもない値を意図的に与えることでUnhandledMatchErrorを発生させています。そのエラーをtry-catchブロックで捕捉した後、捕捉した例外オブジェクト($e)に対して$e->getLine()メソッドを呼び出すことで、エラーが発生したmatch式の開始行番号を取得し、その情報を画面に出力しています。これは、エラー発生箇所の特定に役立つ基本的なデバッグ手法の一つです。

このコードはPHP 8から導入された match 式の使い方を示しています。match 式は、どの条件にも一致せず、かつ default 句が指定されていない場合に UnhandledMatchError というエラーを発生させます。これは、一致するケースがなくてもエラーにならない switch 文との大きな違いです。getLine() メソッドは、このエラーが発生したソースコードの行番号を返すため、デバッグの際に問題の箇所を特定するのに役立ちます。安全なプログラムを作成するためには、予期せぬ値に備えて match 式に default 句を設けるか、このサンプルのように try...catch ブロックでエラーを適切に処理することが重要です。