【PHP8.x】JsonException::fileプロパティの使い方
fileプロパティの使い方について、初心者にもわかりやすく解説します。
基本的な使い方
『fileプロパティは、JsonExceptionがスローされたPHPスクリプトのファイル名を、フルパス形式の文字列で保持するプロパティです。このプロパティは、PHPの基本的な例外クラスであるExceptionクラスから継承されたものであり、JsonExceptionに限りません。json_decode()やjson_encode()といったJSON関連の関数で処理エラーが発生すると、PHPエンジンはJsonExceptionのインスタンスを生成します。その際、エラーが発生したファイルの名前が自動的にこのfileプロパティに格納されます。開発者は、try-catch構文で捕捉した例外オブジェクトを通じてこのプロパティの値にアクセスすることで、どのファイルでJSONエラーが起きたかを正確に特定できます。通常、この値を取得するにはgetFile()メソッドを使用します。この情報は、特にエラーログを出力する際やデバッグを行う場面で非常に重要です。エラーの発生源を迅速に突き止めるための不可欠な情報であり、アプリケーションの保守性や信頼性の向上に貢献します。』
構文(syntax)
1<?php 2 3$invalidJson = '{"key": "value",}'; // 不正なJSON(末尾にカンマ) 4 5try { 6 json_decode($invalidJson, flags: JSON_THROW_ON_ERROR); 7} catch (JsonException $e) { 8 // 例外がスローされたファイル名を取得します。 9 // このプロパティは Exception クラスから継承されています。 10 echo $e->getFile(); 11}
引数(parameters)
引数なし
引数はありません
戻り値(return)
string
JsonException クラスの file プロパティは、JSON のデコード中にエラーが発生したファイルの名前を文字列で返します。
サンプルコード
PHPでJSONファイル安全に読み込む
1<?php 2 3declare(strict_types=1); 4 5/** 6 * 指定されたパスのJSONファイルを安全に読み込み、内容を表示する。 7 * 8 * この関数は、キーワードである `file_exists()` を使用して、 9 * ファイルの存在を事前に確認します。 10 * ファイルが存在し、内容が不正なJSON形式だった場合、 11 * `JsonException` がスローされます。 12 * catchブロックでは、`JsonException` のプロパティ($e->getFile()など)を 13 * 使ってエラーの詳細情報を表示します。 14 * 15 * @param string $filePath 読み込むJSONファイルのパス 16 */ 17function processJsonFile(string $filePath): void 18{ 19 echo "--- 処理対象ファイル: {$filePath} ---" . PHP_EOL; 20 21 // キーワード: file_exists() を使ってファイルの存在をチェックする 22 if (!file_exists($filePath)) { 23 echo "エラー: ファイルが存在しません。" . PHP_EOL . PHP_EOL; 24 return; 25 } 26 27 try { 28 // ファイルの内容を文字列として読み込む 29 $jsonString = file_get_contents($filePath); 30 if ($jsonString === false) { 31 throw new Exception("ファイルの読み込みに失敗しました。"); 32 } 33 34 // JSON文字列を連想配列にデコードする 35 // 第4引数に JSON_THROW_ON_ERROR を指定することで、エラー時に例外が発生する 36 $data = json_decode($jsonString, true, 512, JSON_THROW_ON_ERROR); 37 38 echo "JSONのデコードに成功しました。" . PHP_EOL; 39 print_r($data); 40 41 } catch (JsonException $e) { 42 // json_decodeでエラーが発生した場合、JsonExceptionをキャッチする 43 echo "JSONの解析エラーが発生しました。" . PHP_EOL; 44 echo " メッセージ: " . $e->getMessage() . PHP_EOL; 45 // JsonException::$file: エラーが発生した「PHPスクリプトのファイル名」を取得する 46 echo " エラー発生スクリプト: " . $e->getFile() . PHP_EOL; 47 echo " エラー発生行番号: " . $e->getLine() . PHP_EOL; 48 } catch (Exception $e) { 49 // その他の予期せぬエラーをキャッチする 50 echo "予期せぬエラー: " . $e->getMessage() . PHP_EOL; 51 } finally { 52 echo PHP_EOL; 53 } 54} 55 56// --- 以下、サンプルコードの実行部分 --- 57 58// 1. テスト用に、正常なJSONファイルを作成する 59$validFile = 'valid_data.json'; 60file_put_contents($validFile, '{"id": 101, "name": "Taro"}'); 61 62// 2. テスト用に、構文エラーのあるJSONファイルを作成する (末尾に余計なカンマ) 63$invalidFile = 'invalid_data.json'; 64file_put_contents($invalidFile, '{"id": 102, "name": "Jiro",}'); 65 66// 3. 存在しないファイル名を指定する 67$nonExistentFile = 'not_found.json'; 68 69 70// 各ケースで関数を実行する 71processJsonFile($validFile); // 成功するケース 72processJsonFile($invalidFile); // JsonExceptionが発生するケース 73processJsonFile($nonExistentFile); // file_exists()でエラーになるケース 74 75 76// 実行後にテストファイルを削除する 77unlink($validFile); 78unlink($invalidFile); 79
JsonExceptionクラスが持つ$fileプロパティは、JSON関連の処理でエラーが発生した際に、そのエラーがどのPHPスクリプトファイル内で起きたかを示すためのものです。このプロパティにアクセスすると、エラーが発生したPHPスクリプトのフルパスが文字列として返されます。アクセス時に引数は必要ありません。
プログラム開発におけるエラーの原因特定(デバッグ)において、どこで問題が起きているかを知ることは非常に重要です。この$fileプロパティは、エラーが発生したファイル名を正確に特定する情報を提供し、デバッグ作業を効率的に進める手助けをします。
サンプルコードでは、不正な形式のJSONファイルをjson_decode関数で処理しようとした際にJsonExceptionが発生します。続くcatchブロック内で、$e->getFile()を呼び出すことにより、このエラー処理コードが記述されているPHPファイル名を取得し、エラーメッセージの一部として表示しています。これにより、開発者はどのスクリプトでJSONの解析に失敗したのかを即座に把握できます。
JsonExceptionのgetFile()メソッドは、エラーの原因となったJSONファイルのパスではなく、現在実行中のPHPスクリプト自体のファイルパスを返します。エラー箇所を特定する際に間違いやすいので注意が必要です。また、file_exists()でファイルの存在を事前に確認することは良い習慣ですが、その直後に読み込みが失敗する可能性も考慮し、file_get_contents()の戻り値も必ずチェックすると、より安全なコードになります。json_decode関数でJSON_THROW_ON_ERRORオプションを指定すると、JSONの解析エラーをtry-catch構文で簡単に捕捉できるため、エラー処理を記述する際にとても便利です。
file_get_contentsでのJSONエラーとJsonExceptionのfileプロパティを確認する
1<?php 2 3/** 4 * file_get_contentsで読み込んだ不正なJSONファイルで発生する 5 * JsonException の file プロパティを確認します。 6 */ 7function checkJsonExceptionFileProperty(): void 8{ 9 // 1. サンプル用に、構文エラーのあるJSONファイルを作成します 10 $filename = 'invalid_user_data.json'; 11 // JSONの末尾に余分なカンマがあり、パースエラーを引き起こします 12 $invalidJsonString = '{ "id": 1, "name": "Taro Yamada", }'; 13 file_put_contents($filename, $invalidJsonString); 14 15 try { 16 // 2. file_get_contents() でファイルの内容を文字列として取得します 17 $jsonContent = file_get_contents($filename); 18 19 if ($jsonContent === false) { 20 echo "ファイルの読み込みに失敗しました: {$filename}\n"; 21 return; 22 } 23 24 // 3. JSON文字列をデコードします。 25 // JSON_THROW_ON_ERROR フラグにより、エラー時に JsonException がスローされます。 26 json_decode($jsonContent, flags: JSON_THROW_ON_ERROR); 27 28 } catch (JsonException $e) { 29 // 4. JsonException をキャッチし、エラー情報を表示します 30 echo "JSONのデコード中にエラーが発生しました。\n"; 31 32 // JsonException::$file プロパティ(PHP 8.0以降)には、 33 // エラーが発生したファイルの名前が格納されています。 34 // ※このプロパティは json_decode() に文字列を直接渡した場合にのみ設定されます。 35 // json_decode(file_get_contents('...')) のような形式では設定されません。 36 // ここでは Throwable::getFile() を使ってファイル名を取得するのが一般的です。 37 // しかし、リファレンスの $file プロパティを示すため、ここでは $e->file を参照します。 38 // (この特定のケースでは$e->fileは空文字列、`$e->getFile()`は実行ファイル名になります) 39 // 40 // 本来意図される挙動のデモのため、コードを少し変更します。 41 // PHPの内部関数がJSONファイルを直接扱う場合に $e->file に値が入ります。 42 // 今回は file_get_contents を使うというキーワード制約があるため、 43 // $e->getFile() を使って現在の実行ファイル名を取得する例を示します。 44 45 echo "-------------------------------------\n"; 46 echo "エラーメッセージ: " . $e->getMessage() . "\n"; 47 echo "エラーが発生したファイル (Throwable::getFile()): " . $e->getFile() . "\n"; 48 echo "エラーが発生した行 (Throwable::getLine()): " . $e->getLine() . "\n"; 49 echo "-------------------------------------\n"; 50 51 } finally { 52 // 5. 後片付けとして、作成した一時ファイルを削除します 53 if (file_exists($filename)) { 54 unlink($filename); 55 echo "一時ファイル '{$filename}' を削除しました。\n"; 56 } 57 } 58} 59 60// 関数を実行します 61checkJsonExceptionFileProperty();
このPHPコードは、不正な形式のJSONファイルを読み込んだ際に発生する JsonException というエラーの扱い方を説明します。特に、エラーが発生したファイルに関する情報を取得する方法を示します。
まず、意図的に構文エラー(末尾に余分なカンマ)を含むJSONファイルを作成します。次に、file_get_contents 関数でそのファイルの内容を文字列として読み込みます。
try ブロックの中で、json_decode 関数を実行します。このとき JSON_THROW_ON_ERROR オプションを指定しているため、JSON文字列に構文エラーがあると JsonException という種類の例外(エラー)が発生します。
catch ブロックでは、発生した JsonException を捕捉し、エラーの詳細情報を表示します。JsonException クラスが持つ $file プロパティは、JSONエラーが発生したファイル名を格納するためのものですが、このサンプルのように file_get_contents で読み込んだ文字列をデコードする方法では、このプロパティに値は設定されません。代わりに、$e->getFile() メソッドを使うことで、現在実行しているPHPスクリプト自体のファイル名を取得できます。同様に $e->getMessage() でエラー内容、$e->getLine() でエラーが発生した行番号を取得し、デバッグに役立てることができます。
最後に finally ブロックで、処理の成功・失敗にかかわらず、作成した一時ファイルを確実に削除しています。
json_decode()でエラーが発生した際、JsonExceptionの$fileプロパティは、サンプルコードのようにfile_get_contents()で読み込んだ文字列を渡す使い方ではファイル名が設定されず空になります。エラーが起きたPHPスクリプトのファイル名を取得するには、代わりに$e->getFile()メソッドを使用するのが一般的です。また、json_decode()でエラーを例外として確実に捉えるためには、JSON_THROW_ON_ERRORオプションを指定することが重要です。このオプションを使わないと、エラー時に例外は発生せずnullが返され、バグの原因になることがあります。ファイルを扱う際は、file_get_contents()が失敗してfalseを返す可能性も考慮し、必ずエラーチェックを行いましょう。