【PHP8.x】JsonException::__toString()メソッドの使い方
__toStringメソッドの使い方について、初心者にもわかりやすく解説します。
基本的な使い方
__toStringメソッドは、JsonExceptionオブジェクトが持つ例外情報を、人間が読みやすい形式の文字列として生成するメソッドです。このメソッドはPHPの「マジックメソッド」の一つであり、開発者が直接呼び出すことは通常ありません。代わりに、例外オブジェクトをecho文で画面に出力しようとしたり、文字列としてログファイルに書き込んだりするなど、オブジェクトを文字列として扱う必要がある文脈でPHPによって自動的に呼び出されます。このメソッドが実行されると、例外のクラス名、コンストラクタで設定されたエラーメッセージ、エラーコード、例外がスローされたファイル名と行番号、そしてそこに至るまでの関数呼び出しの履歴であるスタックトレースといった、デバッグに役立つ情報がすべて整形された一つの文字列が返されます。これにより、try-catchブロックでJsonExceptionを捕捉した際に、発生したエラーの詳細な情報を一つの文字列として簡単に取得し、確認することができます。
構文(syntax)
1<?php 2 3try { 4 json_decode('{', flags: JSON_THROW_ON_ERROR); 5} catch (JsonException $e) { 6 echo $e; 7}
引数(parameters)
引数なし
引数はありません
戻り値(return)
string
JsonException::__toString メソッドは、例外オブジェクトを文字列として表現したものを返します。これにより、例外発生時の詳細情報をプログラムやログで確認できるようになります。
サンプルコード
PHP JsonException __toString()でエラー詳細を出力する
1<?php 2 3declare(strict_types=1); 4 5/** 6 * 不正なJSON文字列を配列にデコードしようとした際に発生するJsonExceptionをキャッチし、 7 * __toString()メソッドによって得られる文字列表現を出力します。 8 */ 9function demonstrateJsonExceptionToString(): void 10{ 11 // 構文エラーを含むJSON文字列 (配列要素の後に余分なカンマがある) 12 $invalidJsonForArray = '["apple", "banana",]'; 13 14 try { 15 // JSON文字列を配列にデコードします。 16 // 第4引数に JSON_THROW_ON_ERROR を指定すると、 17 // エラー発生時に JsonException がスローされます。 18 $array = json_decode( 19 $invalidJsonForArray, 20 true, // true: オブジェクトではなく連想配列としてデコード 21 512, 22 JSON_THROW_ON_ERROR 23 ); 24 25 // 例外がスローされるため、この部分は実行されません。 26 print_r($array); 27 28 } catch (JsonException $e) { 29 // JsonExceptionをキャッチします。 30 echo "JSONデコードエラーが発生しました:\n"; 31 32 // 例外オブジェクトをechoで出力すると、__toString()メソッドが自動的に呼び出され、 33 // 例外の詳細情報がフォーマットされた文字列として出力されます。 34 echo $e; 35 } 36} 37 38// 関数を実行 39demonstrateJsonExceptionToString();
このPHPコードは、不正な形式のJSON文字列を配列へデコードしようとした際に発生するJsonExceptionを捕捉し、その内容を文字列として出力するサンプルです。
tryブロック内では、json_decode()関数を使ってJSON文字列のデコードを試みています。このとき、第4引数にJSON_THROW_ON_ERRORを指定しているため、デコードに失敗するとJsonExceptionという種類の例外がスローされます。サンプルコードのJSON文字列'["apple", "banana",]'は、配列の最後に不要なカンマがあるため構文エラーとなります。
スローされた例外はcatchブロックで$eという変数に補足されます。ここでecho $e;のように例外オブジェクトを文字列として扱おうとすると、JsonExceptionクラスに定義されている__toString()メソッドが自動的に呼び出されます。このメソッドは引数を持たず、例外オブジェクトが持つエラーメッセージ、エラーコード、発生箇所(ファイル名と行番号)、スタックトレースなどの情報を、人間が読みやすい形式に整形した一つの文字列(string)を戻り値として返します。
結果として、なぜJSONのデコードに失敗したのかという詳細な情報が画面に出力され、エラーの原因調査に役立てることができます。
json_decode関数でJsonExceptionというエラーを発生させるには、第4引数にJSON_THROW_ON_ERRORを指定することが必須です。この指定がない場合、エラーが発生しても例外はスローされず、代わりにnullが返されます。サンプルコードのように例外オブジェクトをechoで出力すると、__toStringメソッドが自動的に呼び出され、エラーメッセージや発生箇所などの詳細情報が文字列として得られます。この出力はデバッグには大変便利ですが、ファイルパスといった内部情報が含まれる可能性があるため、本番環境でそのままユーザーに表示するのは避けるべきです。エラーの詳細はログに記録し、利用者には一般的なエラーメッセージを返すようにしましょう。
PHP JsonException __toString を使う
1<?php 2 3/** 4 * JsonExceptionの__toStringメソッドの使用例 5 * 6 * オブジェクトが文字列として扱われる場面で自動的に呼び出される 7 * __toStringマジックメソッドの動作を確認します。 8 * 不正なJSONをデコードしようとして発生したJsonExceptionオブジェクトを 9 * echoで出力することで、__toStringの結果を表示します。 10 */ 11 12// わざと不正な形式のJSON文字列を用意します。 13// (正しいJSONでは、キーと文字列はダブルクォートで囲む必要があります) 14$invalidJson = "{'key': 'value',}"; 15 16try { 17 // json_decodeの第4引数に JSON_THROW_ON_ERROR を指定すると、 18 // パースエラー時に JsonException がスローされます。 19 json_decode($invalidJson, true, 512, JSON_THROW_ON_ERROR); 20} catch (JsonException $e) { 21 // 例外オブジェクト $e を echo で直接出力します。 22 // このとき、内部的に JsonException::__toString() メソッドが自動的に呼び出され、 23 // 例外情報が整形された文字列として返されます。 24 // これが他の言語の toString() メソッドと似た働きをします。 25 echo $e; 26} 27 28?>
JsonExceptionクラスの__toStringメソッドは、オブジェクトを文字列として表現するためのものです。このメソッドはPHPの「マジックメソッド」の一つであり、オブジェクトが文字列として扱われる状況、例えばechoやprintで出力しようとした際に自動的に呼び出されます。これは、他のプログラミング言語におけるtoString()メソッドと同様の役割を果たします。
サンプルコードでは、まずjson_decode関数を使って意図的に不正な形式のJSON文字列をデコードしようとしています。このとき、第四引数にJSON_THROW_ON_ERRORオプションが指定されているため、デコードに失敗するとJsonExceptionという種類の例外が発生します。
try...catch構文によって発生したJsonExceptionオブジェクトは、変数$eに格納されます。catchブロック内でecho $e;と記述すると、$eオブジェクトを文字列として出力しようとするため、内部で自動的にJsonException::__toString()メソッドが実行されます。
このメソッドに引数はありません。戻り値として、例外のメッセージ、発生したファイル名、行番号、スタックトレースなど、デバッグに役立つ情報が整形されたstring(文字列)が返されます。これにより、例外オブジェクトを直接出力するだけで、エラーの詳細を人間が読みやすい形式で確認できます。
echoで例外オブジェクトを直接出力すると、__toStringメソッドが自動的に呼び出され、エラー内容が文字列として整形されます。これはデバッグ時にエラーの原因を特定するのに役立ちます。ただし、この文字列にはファイルパスやスタックトレースといったシステムの内部情報が含まれる場合があるため、そのままユーザー画面に表示することは避けるべきです。情報漏洩につながるセキュリティ上のリスクがあるため、本番環境ではエラー内容をログに記録し、利用者には汎用的なエラーメッセージを見せるなどの対応が推奨されます。