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

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

作成日: 更新日:

基本的な使い方

fileプロパティは、UnhandledMatchErrorが発生したソースファイルの完全なパスを保持するプロパティです。PHP 8から導入されたmatch式は、非常に強力な制御構造であり、与えられた値に対して定義された複数のケースの中から、厳密な比較に基づいて一致するものを実行します。このmatch式の重要な特徴の一つは、すべての可能な入力値に対して対応するケースが定義されているべきであるという「網羅性」です。もしmatch式に渡された値が、定義されているどのケースにも一致せず、さらにdefaultキーワードによるフォールバックの処理も定義されていない場合、PHPはUnhandledMatchErrorをスローします。

このfileプロパティは、そのUnhandledMatchErrorが実際にどのPHPスクリプトファイル内で発生したのかを文字列として正確に提供します。開発者やシステムエンジニアがエラーハンドリングやデバッグを行う際には、この情報が非常に重要です。例えば、例外をキャッチした際に$errorObject->fileのようにこのプロパティを参照することで、問題が発生しているmatch式が記述されている具体的なファイルパスを特定できます。これにより、網羅性が不足しているmatch式を見つけ出し、ケースの追加やdefaultキーワードの適切な使用によって、エラーを修正し、アプリケーションの安定性を向上させるための迅速な対応が可能になります。

構文(syntax)

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

引数(parameters)

戻り値(return)

string

UnhandledMatchError クラスの file プロパティは、match 式で例外が発生した際のファイル名を文字列で返します。

サンプルコード

PHP8 UnhandledMatchError fileプロパティ取得

1<?php
2
3/**
4 * UnhandledMatchError の file プロパティ(エラー発生ファイルパス)を
5 * 示すサンプルコードです。
6 * `file_get_contents` を使用してファイルの内容を読み込み、その内容を
7 * `match` 式で処理する際に、意図的にハンドルされないケースを発生させます。
8 */
9function demonstrateUnhandledMatchErrorFileProperty(): void
10{
11    // UnhandledMatchErrorを発生させるための設定を一時ファイルに書き込みます。
12    // このファイルの内容がmatch式で対応するケースを持たないように設定します。
13    $tempFilePath = 'temp_config.txt';
14    $unhandledAction = 'unsupported_action'; // match式で処理されない値
15
16    // 一時ファイルに内容を書き込む
17    file_put_contents($tempFilePath, $unhandledAction);
18
19    try {
20        echo "--- 処理開始 ---\n";
21        echo "ファイル '{$tempFilePath}' の内容を読み込み、match式で処理します。\n\n";
22
23        // `file_get_contents` を使用してファイルの内容を読み込みます。
24        $action = file_get_contents($tempFilePath);
25
26        // PHP 8 の `match` 式を使用します。
27        // 変数 $action の値が、定義されたどのアーム(case)にも一致しない場合、
28        // `UnhandledMatchError` がスローされます。
29        $message = match ($action) {
30            'display_info' => '情報を表示します。',
31            'execute_command' => 'コマンドを実行します。',
32            // 'unsupported_action' に対応するアームがないため、
33            // ここで UnhandledMatchError が発生します。
34        };
35
36        echo "結果: " . $message . "\n"; // この行は実行されません
37    } catch (UnhandledMatchError $e) {
38        echo "--- エラー捕捉 ---\n";
39        echo "UnhandledMatchError を捕捉しました!\n";
40        // `getFile()` メソッドは、このエラーが発生したPHPスクリプトのファイルパスを返します。
41        echo "エラー発生ファイル: " . $e->getFile() . "\n";
42        echo "エラーメッセージ: " . $e->getMessage() . "\n";
43    } finally {
44        // 作成した一時ファイルを削除し、クリーンアップします。
45        if (file_exists($tempFilePath)) {
46            unlink($tempFilePath);
47            echo "\n一時ファイル '{$tempFilePath}' を削除しました。\n";
48        }
49        echo "--- 処理終了 ---\n";
50    }
51}
52
53// デモンストレーション関数を実行します。
54demonstrateUnhandledMatchErrorFileProperty();

このサンプルコードは、PHP 8で導入されたUnhandledMatchErrorクラスが持つfileプロパティ(getFile()メソッドでアクセス)の挙動を説明します。UnhandledMatchErrorは、PHP 8のmatch式を使用する際に、与えられた値に対応するケース(アーム)が一つも見つからなかった場合に発生するエラーです。

コードでは、まずfile_put_contents関数を使って一時ファイルに「unsupported_action」という文字列を書き込みます。次に、file_get_contents関数でこのファイルの内容を読み込み、その結果をmatch式に渡します。しかし、match式には「unsupported_action」に対応するケースが定義されていないため、意図的にUnhandledMatchErrorが発生します。

try-catchブロックでこのエラーを捕捉した後、$e->getFile()メソッドを呼び出すことで、エラーが実際に発生したPHPスクリプトのファイルパスを文字列として取得し、画面に表示しています。getFile()メソッドは引数を取らず、エラー発生元の正確なファイルパスをstring型で返します。これは、プログラムのエラー原因を特定し、デバッグする際に非常に重要な情報となります。

match式は、与えられた値が定義されたどのケースにも一致しない場合、UnhandledMatchErrorを発生させます。これはswitch文と異なり、全ての可能性を考慮するか、明示的にエラーを捕捉する必要があります。実用では、予期せぬ値に対応するため、最終的な_(デフォルト)ケースを設けるか、今回のサンプルコードのようにtry-catchでこのエラーを確実に捕捉し、適切なエラーハンドリングを行うことが重要です。$e->getFile()は、エラーが発生したPHPスクリプトのファイルパスを示し、デバッグ時に非常に役立ちます。また、file_get_contentsのようなファイル操作では、ファイルの存在確認や読み込み権限、エラー発生時の処理も考慮し、より堅牢なコードを記述することを心がけてください。一時ファイルはfinallyブロックで必ず削除し、リソースの管理を徹底しましょう。

PHP 8 UnhandledMatchError を file_put_contents でログ記録する

1<?php
2
3// このサンプルコードは、PHP 8で導入されたUnhandledMatchErrorを意図的に発生させ、
4// そのエラー情報を捕捉し、file_put_contents関数を使ってログファイルに記録する方法を示します。
5
6// エラーログを保存するファイルのパスを定義します。
7// __DIR__ は現在のスクリプトがあるディレクトリを指します。
8$logFilePath = __DIR__ . '/unhandled_match_error_log.txt';
9
10try {
11    // UnhandledMatchErrorを発生させるための値を定義します。
12    // この値(4)に対応するcaseがなく、デフォルトのアームもありません。
13    $status = 4;
14
15    // PHP 8のmatch式を使用します。
16    // $statusがどのcaseにもマッチせず、defaultアームもないため、
17    // ここでUnhandledMatchErrorがスローされます。
18    $result = match ($status) {
19        1 => 'Pending',
20        2 => 'Processing',
21        3 => 'Completed',
22        // '4' に対応するcaseや 'default' アームがないため、エラーが発生します。
23    };
24
25    // 上記でエラーがスローされるため、この行は実行されません。
26    echo "Match result: " . $result . PHP_EOL;
27
28} catch (UnhandledMatchError $e) {
29    // UnhandledMatchErrorを捕捉します。
30    echo "UnhandledMatchErrorを捕捉しました!" . PHP_EOL;
31
32    // 捕捉したエラーオブジェクトから、エラーが発生したファイルパスを取得します。
33    // これは`UnhandledMatchError`クラスの`file`プロパティ(実際にはException::getFile()メソッド)です。
34    $errorOccurredFile = $e->getFile();
35
36    // その他の有用なエラー情報も取得します。
37    $errorMessage = $e->getMessage();
38    $errorLine = $e->getLine();
39
40    // ログファイルに書き込む内容を準備します。
41    $logContent = "タイムスタンプ: " . date('Y-m-d H:i:s') . PHP_EOL;
42    $logContent .= "エラータイプ: " . get_class($e) . PHP_EOL;
43    $logContent .= "メッセージ: " . $errorMessage . PHP_EOL;
44    $logContent .= "エラーが発生したファイル: " . $errorOccurredFile . PHP_EOL;
45    $logContent .= "行番号: " . $errorLine . PHP_EOL;
46    $logContent .= "----------------------------------------" . PHP_EOL;
47
48    // file_put_contents関数を使用して、準備したエラー情報をログファイルに書き込みます。
49    // FILE_APPENDフラグを指定することで、既存のファイル内容を上書きせずに、
50    // 新しい内容をファイルの末尾に追加します。
51    if (file_put_contents($logFilePath, $logContent, FILE_APPEND) !== false) {
52        echo "エラー詳細をログファイルに記録しました: " . $logFilePath . PHP_EOL;
53    } else {
54        echo "エラーログファイルへの書き込みに失敗しました: " . $logFilePath . PHP_EOL;
55    }
56}
57
58// このスクリプトを実行すると、`unhandled_match_error_log.txt`というファイルが
59// スクリプトと同じディレクトリに生成され、エラー情報が記録されます。
60

このサンプルコードは、PHP 8で導入されたUnhandledMatchErrorというエラーを捕捉し、その詳細をログファイルに記録する方法を示しています。UnhandledMatchErrorは、match式において、どのcaseにもマッチせず、かつdefaultアームが定義されていない場合に発生します。

コードでは、意図的にmatch式でエラーを発生させ、try-catchブロックでこのUnhandledMatchErrorを捕捉しています。エラーが捕捉されると、エラーオブジェクト$eから様々な情報を取得できます。その中でも、リファレンス情報にあるfileプロパティ(実際にはgetFile()メソッドを通じてアクセス)は、エラーが発生したPHPスクリプトのフルパスを文字列として返します。このメソッドは引数を必要としません。

取得したエラー情報(発生ファイル、メッセージ、行番号など)は、変数$logContentにまとめられます。その後、file_put_contents関数を使って、この情報をunhandled_match_error_log.txtというファイルに書き込んでいます。file_put_contentsは、第一引数に書き込むファイルのパス、第二引数に書き込む内容、第三引数に書き込みモード(ここではFILE_APPENDで追記)を受け取ります。ファイルへの書き込みが成功すると書き込まれたバイト数を、失敗するとfalseを戻り値として返します。このようにして、発生したエラーの記録を行い、デバッグやシステム運用に役立てることが可能です。

match式では、すべての取りうる値に対応するcasedefaultアームを必ず定義しないと、PHP 8で導入されたUnhandledMatchErrorが発生します。このエラーをtry-catchで捕捉し、$e->getFile()でエラー発生元のファイルパスを取得できます。その情報をfile_put_contents関数でログファイルに記録する際は、ログファイルの書き込み権限があるか確認し、既存のログを上書きしないようFILE_APPENDフラグの指定が重要です。アプリケーションの安定性のため、本番環境ではより堅牢なロギングライブラリの活用も検討してください。

【PHP8.x】fileプロパティの使い方 | いっしー@Webエンジニア