【PHP8.x】lineプロパティの使い方

lineプロパティの使い方について、初心者にもわかりやすく解説します。

作成日: 更新日:

基本的な使い方

lineプロパティは、UnhandledMatchErrorクラスで発生したエラーの位置を示す行番号を保持するプロパティです。PHP 8で導入されたmatch式は、値を様々なケースと比較し、一致するブロックを実行する簡潔な条件分岐の構文です。しかし、このmatch式において、比較対象の値がどのケースにも一致しなかった場合、または期待されるすべてのケースがコード内で網羅されていない場合に、UnhandledMatchErrorという特殊なエラーが発生します。

このlineプロパティは、そのUnhandledMatchErrorが発生したPHPスクリプト内の具体的な行番号を整数値として提供します。システムエンジニアにとって、プログラムの不具合やエラーを特定し、修正することは日々の業務において非常に重要です。lineプロパティが示す行番号は、UnhandledMatchErrorが発生したコードの正確な場所を指し示すため、開発者が問題の原因を迅速に突き止め、デバッグ作業を効率的に進めるための不可欠な情報となります。

例えば、エラーログを分析する際や、try-catchブロックでUnhandledMatchErrorを捕捉した場合に、そのエラーオブジェクトのlineプロパティを参照することで、問題のあるmatch式がソースコードのどの行にあるのかを即座に把握できます。これにより、開発者はエラーの原因となっているmatch式の記述ミスや、網羅性の不足を特定し、プログラムの信頼性を向上させるための修正を効果的に行うことが可能になります。

構文(syntax)

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

引数(parameters)

戻り値(return)

int

UnhandledMatchError クラスの line プロパティは、match 式で未処理のケースが発生した際の、そのエラーが発生したコード行番号を整数で返します。

サンプルコード

PHP 8 UnhandledMatchError::line でエラー行を取得する

1<?php
2
3/**
4 * PHP 8 の UnhandledMatchError::line プロパティの使用例を示します。
5 * UnhandledMatchError は、match 式が網羅的でない場合に発生する例外です。
6 * その line プロパティは、エラーが発生した行番号を返します。
7 *
8 * @param int $value テスト用の整数値
9 */
10function demonstrateUnhandledMatchErrorLine(int $value): void
11{
12    try {
13        // この match 式は、$value が 1 または 2 のケースのみを処理します。
14        // $value が他の値(例: 3)の場合、UnhandledMatchError が発生します。
15        $result = match ($value) {
16            1 => "One is handled.",
17            2 => "Two is handled.",
18            // default ケースがないため、$valueが3の時に UnhandledMatchError が発生する
19        };
20        echo "Result: " . $result . PHP_EOL;
21    } catch (UnhandledMatchError $e) {
22        echo "UnhandledMatchError が捕捉されました!" . PHP_EOL;
23        echo "エラーメッセージ: " . $e->getMessage() . PHP_EOL;
24        // UnhandledMatchError::line プロパティは、エラーが発生した行番号(int型)を返します。
25        echo "エラー発生行: " . $e->line . PHP_EOL;
26    } catch (Throwable $e) {
27        // その他の予期せぬ例外を捕捉します。
28        echo "予期せぬエラーが発生しました: " . $e->getMessage() . PHP_EOL;
29    }
30}
31
32// UnhandledMatchError を意図的に発生させる値 (この行ではなく、match式のある行がエラーとして報告されます)
33demonstrateUnhandledMatchErrorLine(3);
34
35// エラーが発生しないケース (参考)
36// demonstrateUnhandledMatchErrorLine(1);
37?>

PHP 8のUnhandledMatchError::lineプロパティは、match式がすべての可能なケースを網羅していない場合に発生するUnhandledMatchError例外から、エラーが発生した行番号を取得するためのものです。このプロパティは引数を取らず、エラーが発生したソースコードの具体的な行番号を整数値(int型)で返します。

提供されたサンプルコードでは、demonstrateUnhandledMatchErrorLine関数内でmatch式が定義されています。このmatch式は、引数$value1または2の場合のみを処理するように記述されており、その他の値に対するdefaultケースが意図的に省略されています。そのため、demonstrateUnhandledMatchErrorLine(3)のように、match式で処理されない値3が渡されると、UnhandledMatchErrorが発生します。

try-catchブロックでこの例外を捕捉した後、$e->lineプロパティにアクセスすることで、エラーが実際に発生したmatch式の行番号を取得し、出力しています。これにより、プログラマーはmatch式のどの箇所で網羅性の問題が発生したのかを正確に把握でき、デバッグやエラーハンドリングを効率的に行うことが可能になります。このプロパティは、match式関連のエラーの原因特定に非常に役立つ情報を提供します。

PHP 8のmatch式を利用する際は、取りうる全ての値を網羅するか、defaultケースを必ず設定しないとUnhandledMatchErrorが発生します。このエラーが起こった時、例外オブジェクトのlineプロパティ($e->line)は、問題が発生したコードの行番号を整数で返します。エラー箇所を特定する上で非常に重要な情報です。このような実行時エラーは、必ずtry-catchブロックで捕捉し、適切なエラー処理を行うことで、プログラムの堅牢性を高めることが大切です。また、このlineプロパティは、コードに直接記述するマジック定数の__LINE__とは異なり、実行時に発生したエラーの行を示す点にご留意ください。

PHP UnhandledMatchErrorの発生行を取得する

1<?php
2
3/**
4 * プログラミング言語: PHP
5 * バージョン: 8
6 *
7 * このコードは、PHP 8 の `match` 式で `UnhandledMatchError` が発生した際に、
8 * そのエラーの発生行番号 (`line`) を取得する方法を示します。
9 */
10function demonstrateUnhandledMatchErrorLine(): void
11{
12    try {
13        echo "値をチェックします...\n";
14
15        // PHP 8 の `match` 式を使用。
16        // `default` ケースがなく、どの条件にも一致しない値を渡すことで
17        // `UnhandledMatchError` を意図的に発生させます。
18        // この `match` 式の開始行がエラーの発生箇所として報告されます。
19        $result = match (3) { // ← この行番号が UnhandledMatchError の「line」として報告されます。
20            1 => 'One',
21            2 => 'Two',
22        };
23
24        echo "結果: " . $result . "\n"; // この行は UnhandledMatchError が発生するため実行されません。
25
26    } catch (UnhandledMatchError $e) {
27        // `UnhandledMatchError` をキャッチした場合の処理です。
28        // エラーが発生した行番号は、`getLine()` メソッドを通じて取得します。
29        // これは PHP のすべての Throwable オブジェクトに共通の標準的な方法です。
30        $errorLine = $e->getLine();
31        $errorMessage = $e->getMessage();
32        $errorFile = $e->getFile();
33
34        echo "--- UnhandledMatchError を検知しました ---\n";
35        echo "メッセージ: " . $errorMessage . "\n";
36        echo "エラーが発生したファイル: " . $errorFile . "\n";
37        echo "エラーが発生した行番号: " . $errorLine . "\n"; // キーワード「line」に対応。
38        // エラーの発生行番号を画面に出力することで、キーワード「送信」の意図を満たします。
39
40    } catch (Throwable $e) {
41        // UnhandledMatchError 以外の予期せぬエラーを包括的に処理する場合の例です。
42        echo "--- 予期せぬエラーを検知しました ---\n";
43        echo "メッセージ: " . $e->getMessage() . "\n";
44        echo "エラーが発生したファイル: " . $e->getFile() . "\n";
45        echo "エラーが発生した行番号: " . $e->getLine() . "\n";
46    } finally {
47        // エラーの有無にかかわらず最終的に実行される処理です。
48        echo "処理を終了します。\n";
49    }
50}
51
52// 関数を実行して、UnhandledMatchError の発生と処理を確認します。
53demonstrateUnhandledMatchErrorLine();

このPHPコードは、PHP 8で導入されたmatch式が意図しない状況でエラーを起こした際の処理方法を示します。match式は、与えられた値がどの条件にも一致せず、かつdefaultケースが定義されていない場合にUnhandledMatchErrorというエラーを発生させます。

サンプルコードでは、match (3)に対して1と2のケースのみ定義し、意図的にUnhandledMatchErrorを発生させています。プログラムはtry-catchブロックによってこのエラーを捕捉し、停止することなく処理を続けます。

エラーが捕捉された際、UnhandledMatchErrorオブジェクトからエラーの発生状況を詳しく取得できます。特に、リファレンスにある「line」はエラーが発生したソースコードの行番号を指し、$e->getLine()メソッドを通じて取得します。このgetLine()メソッドは引数を必要とせず、エラーが発生した正確な行番号を整数値(int)として返します。取得された行番号はecho文によって画面に「送信」表示され、開発者がエラー箇所を迅速に特定し、問題を解決するのに役立ちます。

UnhandledMatchErrorはPHP 8のmatch式で、どのケースにも一致せず、かつdefaultが省略された場合に発生するエラーです。このエラーが発生した際、getLine()メソッドを使用するとmatch式の開始行番号を取得できます。これはデバッグ時にエラー箇所を特定する重要な情報となります。getLine()UnhandledMatchErrorだけでなく、全ての例外・エラーで共通して使えるThrowableインターフェースのメソッドです。実運用では、取得したエラー情報は画面出力だけでなく、ログファイルに記録したり、監視システムへ通知したりすることが一般的で、これによってシステムの安定稼働を助けます。安全なコードのためには、match式でdefaultケースを設定し、予期せぬエラーを防ぐことを推奨します。