【PHP8.x】JsonException::__construct()メソッドの使い方
__constructメソッドの使い方について、初心者にもわかりやすく解説します。
基本的な使い方
__constructメソッドは、JsonExceptionクラスの新しいインスタンスが生成される際に、そのオブジェクトを初期化するために実行されるメソッドです。このメソッドはコンストラクタとして機能し、主にjson_encode()やjson_decode()といったJSON関連の関数でエンコードやデコードに失敗したときに、PHPエンジンによって内部的に呼び出されます。JsonExceptionはPHPの基本的な例外クラスであるExceptionを継承しているため、このコンストラクタはその親クラスの動作を引き継ぎます。具体的には、発生したエラーに関する情報、すなわちエラーメッセージ、JSON_ERROR_*定数に対応するエラーコード、そして先行する例外を引数として受け取り、生成される例外オブジェクトのプロパティとして設定します。開発者がこのコンストラクタを直接呼び出すことは通常ありませんが、try...catch構文を用いてJsonExceptionを捕捉することで、このコンストラクタによって初期化されたエラー情報を取得し、プログラムの堅牢性を高めるための適切なエラー処理を実装することが可能になります。
構文(syntax)
1public __construct(string $message = "", int $code = 0, ?Throwable $previous = null)
引数(parameters)
string $message = "", int $code = 0, ?Throwable $previous = null
- string $message: 例外の主要なエラーメッセージを指定する文字列です。
- int $code = 0: 例外に関連付けられるエラーコードを指定する整数です。デフォルトは 0 です。
- ?Throwable $previous = null: この例外の原因となった以前のスロー可能オブジェクト(例外など)を指定します。デフォルトは null です。
戻り値(return)
戻り値なし
戻り値はありません
サンプルコード
PHPクラスコンストラクタで例外を扱う
1<?php 2 3/** 4 * PHPのクラスコンストラクタの例を示すためのカスタム例外クラス。 5 * 6 * Exceptionクラスを継承しており、JsonExceptionと同様のコンストラクタを持ちます。 7 * コンストラクタは、`new`キーワードでオブジェクトがインスタンス化される際に 8 * 自動的に呼び出される特別なメソッドです。 9 */ 10class MyCustomException extends Exception 11{ 12 /** 13 * MyCustomExceptionクラスのコンストラクタ。 14 * 15 * @param string $message [optional] 例外メッセージ 16 * @param int $code [optional] 例外コード 17 * @param ?Throwable $previous [optional] 前の例外。例外チェーンに使用されます。 18 */ 19 public function __construct(string $message = "", int $code = 0, ?Throwable $previous = null) 20 { 21 // 親クラス(Exception)のコンストラクタを呼び出して、プロパティを初期化します。 22 parent::__construct($message, $code, $previous); 23 } 24 25 /** 26 * この例外オブジェクトを文字列で表現します。 27 * 28 * @return string 29 */ 30 public function __toString(): string 31 { 32 return __CLASS__ . ": [{$this->code}]: {$this->message}\n"; 33 } 34} 35 36// --- 以下、コンストラクタの使用例 --- 37 38try { 39 // データベース接続に失敗した、というシナリオを想定した元の例外 40 $databaseException = new PDOException("データベースに接続できません。", 500); 41 42 // MyCustomExceptionをインスタンス化する際にコンストラクタが呼び出されます。 43 // 3つの引数(メッセージ、コード、前の例外)を渡して、例外をスロー(発生)させます。 44 throw new MyCustomException( 45 "ユーザー情報の取得に失敗しました。", 46 101, 47 $databaseException 48 ); 49} catch (MyCustomException $e) { 50 // スローされた例外をキャッチし、コンストラクタで設定された情報を表示します。 51 echo "キャッチした例外: " . $e->getMessage() . PHP_EOL; 52 echo "エラーコード: " . $e->getCode() . PHP_EOL; 53 54 // getPrevious() で、コンストラクタの第3引数に渡した例外を取得できます。 55 if ($previous = $e->getPrevious()) { 56 echo "根本原因: " . $previous->getMessage() . PHP_EOL; 57 echo "根本原因のコード: " . $previous->getCode() . PHP_EOL; 58 } 59}
__constructは、PHPのクラスにおいて「コンストラクタ」と呼ばれる特別なメソッドです。このメソッドは、newキーワードを使ってクラスからオブジェクトが生成される際に一度だけ自動的に呼び出されます。JsonExceptionクラスのコンストラクタは、例外オブジェクトが生成されるときに、その初期設定を行う役割を持ちます。
このコンストラクタは3つの引数を取ります。第1引数の$messageは「どのようなエラーが発生したか」を示す文字列です。第2引数の$codeはエラーの種類を識別するための整数値です。第3引数の$previousには、この例外が発生する根本原因となった、一つ前の例外オブジェクトを指定できます。これにより、エラーの連鎖を追跡することが可能になります。コンストラクタはオブジェクトの初期化が目的のため、特定の値を返すことはなく、戻り値はありません。
サンプルコードでは、new MyCustomException(...)の行でコンストラクタが呼び出され、引数で渡されたメッセージやエラーコードがオブジェクトの内部に設定されます。その後、catchブロック内でgetMessage()やgetPrevious()といったメソッドを使い、コンストラクタで設定された情報を取得して表示しています。
コンストラクタは__constructという名前の特別なメソッドで、newでオブジェクトが作られる際に自動で呼び出されます。クラスを継承して独自のコンストラクタを定義した場合、親クラスのコンストラクタは自動で実行されません。そのため、サンプルコードのようにparent::__construct()を呼び出し、親クラスの初期化処理を明示的に行う必要があります。これを忘れると、getMessage()などのメソッドが期待通りに動作しない原因となります。また、第3引数$previousに元の例外を設定すると、エラーの根本原因を追跡しやすくなり、デバッグの際に非常に役立ちます。
JsonExceptionコンストラクタの活用例
1<?php 2 3declare(strict_types=1); 4 5/** 6 * この関数は、JsonExceptionのコンストラクタがどのように利用されるかを示します。 7 * 8 * json_decode関数は、JSON_THROW_ON_ERRORフラグが指定されていると、 9 * パースエラー発生時に内部でJsonExceptionのコンストラクタを呼び出し、 10 * 例外オブジェクトをスローします。 11 * このサンプルでは、そのスローされた例外をcatchし、 12 * コンストラクタによって設定されたエラー情報を取得・表示します。 13 */ 14function demonstrateJsonExceptionConstructor(): void 15{ 16 // JSONの仕様では文字列はダブルクォートで囲む必要があり、 17 // シングルクォートは無効なため、この文字列はパースに失敗します。 18 $invalidJsonString = "{'user_id': 1, 'name': 'Taro'}"; 19 20 try { 21 // 第4引数に JSON_THROW_ON_ERROR を指定することで、エラー時に例外がスローされます。 22 json_decode($invalidJsonString, true, 512, JSON_THROW_ON_ERROR); 23 } catch (JsonException $e) { 24 // catchブロックでJsonExceptionオブジェクトを捕捉します。 25 // この$eオブジェクトは、PHP内部で new JsonException(...) によって生成されたものです。 26 27 echo "JSONパースエラーを捕捉しました。" . PHP_EOL; 28 29 // getMessage()でコンストラクタの第1引数($message)に渡された値を取得します。 30 echo "エラーメッセージ: " . $e->getMessage() . PHP_EOL; 31 32 // getCode()でコンストラクタの第2引数($code)に渡された値を取得します。 33 echo "エラーコード: " . $e->getCode() . PHP_EOL; 34 35 // getPrevious()でコンストラクタの第3引数($previous)に渡された値を取得します。 36 // この場合は通常nullです。 37 if ($e->getPrevious() === null) { 38 echo "先行する例外: なし" . PHP_EOL; 39 } 40 } 41} 42 43// 関数を実行して動作を確認します。 44demonstrateJsonExceptionConstructor(); 45 46?>
JsonException::__constructは、JsonExceptionクラスのオブジェクトが生成される際に自動的に呼び出される、コンストラクタと呼ばれる特別なメソッドです。このメソッドは、JSON処理中に発生したエラーの詳細情報をオブジェクトに設定する役割を担います。
サンプルコードは、開発者が直接このコンストラクタを呼び出すのではなく、PHPのjson_decode関数が内部で利用する場面を示しています。json_decode関数の第4引数にJSON_THROW_ON_ERRORを指定すると、無効なJSON文字列を処理した際にパースエラーとなり、PHPが内部でJsonExceptionのコンストラクタを呼び出して例外オブジェクトを生成し、それを発生させます。
try...catch構文で捕捉した例外オブジェクトには、コンストラクタに渡された情報が格納されています。第1引数$messageはエラー内容の文字列でgetMessage()メソッド、第2引数$codeはエラーの種類を示す整数でgetCode()メソッドを使って取得できます。第3引数$previousは、別の例外に起因する場合にその例外を格納しますが、この例では使われていません。コンストラクタはオブジェクトの初期化が目的のため、戻り値はありません。
JsonExceptionのコンストラクタは、開発者が直接呼び出すことはほとんどありません。サンプルコードのようにjson_decode関数でJSON_THROW_ON_ERRORフラグを指定すると、JSONの解析エラー発生時にPHPが内部でこのコンストラクタを呼び出し、生成した例外オブジェクトをスローします。このフラグを忘れると例外は発生しないため注意が必要です。外部から受け取ったJSON文字列を扱う際は、意図しない入力でプログラムが停止することを防ぐため、必ずtry...catch構文で例外を捕捉してください。catchブロックで得られるエラーメッセージやコードは、デバッグの際に非常に役立ちます。