【PHP8.x】DomainException::messageプロパティの使い方
messageプロパティの使い方について、初心者にもわかりやすく解説します。
基本的な使い方
messageプロパティは、例外に関する説明文(エラーメッセージ)を保持するプロパティです。このプロパティは、値が定義された有効な範囲、すなわちデータドメインに属していないことを示すためにスローされるDomainExceptionクラスに属しています。例えば、特定の関数が引数として正の整数のみを受け付ける仕様であるにもかかわらず、負の数が渡された場合などにDomainExceptionが使用されます。その際、messageプロパティには「引数は正の数でなければなりません」といった、エラーの原因を具体的に説明する文字列が格納されます。このエラーメッセージは、プログラムのデバッグやエラーログの記録において非常に重要な役割を果たします。開発者はこのメッセージを読むことで、問題の発生箇所と原因を迅速に特定できます。messageプロパティの値は、DomainExceptionのインスタンスが生成される際にコンストラクタの引数として設定され、getMessage()メソッドを通じて取得するのが一般的です。このプロパティは、PHPの全ての例外クラスの基底となるExceptionクラスから継承されたものであり、例外処理における基本的な要素の一つです。
構文(syntax)
1<?php 2 3try { 4 // DomainExceptionを意図的にスローする 5 throw new DomainException("値が有効なドメインの範囲外です。"); 6} catch (DomainException $e) { 7 // 継承されたgetMessage()メソッドでメッセージを取得する 8 echo $e->getMessage(); 9} 10 11?>
引数(parameters)
引数なし
引数はありません
戻り値(return)
string
このプロパティは、例外が発生した際の詳細なメッセージを文字列で返します。
サンプルコード
PHPでDomainExceptionとメッセージボックスを表示する
1<?php 2 3declare(strict_types=1); 4 5/** 6 * ユーザーの年齢を検証し、結果をメッセージボックスで表示するクラス 7 */ 8class AgeValidator 9{ 10 /** 11 * 年齢を検証し、その結果をJavaScriptのalert()で表示するHTMLを生成します。 12 * 13 * この関数は、PHPの例外処理を利用して、ビジネスルール(ドメインルール)に 14 * 違反した場合のメッセージをハンドリングする方法を示します。 15 * 16 * @param int $age 検証対象の年齢 17 * @return void この関数は直接HTMLを出力します 18 */ 19 public static function showValidationMessage(int $age): void 20 { 21 // デフォルトのメッセージを定義 22 $message = 'ようこそ!あなたは成人です。'; 23 24 try { 25 // 年齢が18歳未満かどうかをチェック 26 if ($age < 18) { 27 // 条件に合わない場合、DomainExceptionをスローする 28 // コンストラクタに渡した文字列が、この例外の`message`プロパティに設定される 29 throw new DomainException('18歳未満の方はアクセスできません。'); 30 } 31 } catch (DomainException $e) { 32 // DomainExceptionがスローされた場合、ここでキャッチする 33 // $e->getMessage()は、スローされた例外の`message`プロパティの値を取得するメソッド 34 $message = $e->getMessage(); 35 } 36 37 // PHPの変数を安全にJavaScriptに渡すためにjson_encodeを使用 38 $escapedMessage = json_encode($message); 39 40 // JavaScriptのalert()を使用してメッセージボックスを表示するHTMLを出力 41 echo <<<HTML 42<!DOCTYPE html> 43<html lang="ja"> 44<head> 45 <meta charset="UTF-8"> 46 <title>PHP Message Box Example</title> 47</head> 48<body> 49 <p>ページが読み込まれました。メッセージボックスを確認してください。</p> 50 <script> 51 // PHPから渡されたメッセージをアラートで表示 52 alert({$escapedMessage}); 53 </script> 54</body> 55</html> 56HTML; 57 } 58} 59 60// --- 実行コード --- 61// 以下の値を変更して、表示されるメッセージが変わることを確認してください 62// 例: 20 -> 成功メッセージ, 17 -> DomainExceptionのメッセージ 63AgeValidator::showValidationMessage(17);
このサンプルコードは、DomainExceptionクラスのmessageプロパティを利用して、プログラムのルール違反に関するメッセージを取得し、ブラウザのメッセージボックスに表示する方法を解説するものです。
DomainExceptionは、プログラムが定めたビジネス上のルール(ドメインルール)に違反した際に使用される例外クラスです。このコードでは、「18歳未満はアクセスできない」というルールを検証しています。
tryブロックの中で、年齢が18歳未満の場合にthrow new DomainException('18歳未満の方はアクセスできません。');という処理が実行されます。ここでDomainExceptionのインスタンスが生成される際、引数として渡されたエラーメッセージの文字列が、そのオブジェクトのmessageプロパティに保存されます。
catch (DomainException $e)ブロックでは、スローされた例外を$eという変数で捕捉します。$e->getMessage()メソッドを呼び出すと、messageプロパティに保存された文字列を取得できます。このgetMessage()メソッドは引数を持たず、戻り値としてプロパティに格納されている文字列(string型)を返します。
取得したメッセージは変数$messageに代入され、最終的にJavaScriptのalert()関数によって画面に表示されます。もしルール違反がなければ例外は発生せず、catchブロックは実行されないため、最初に定義されたデフォルトのメッセージが表示されます。
このコードは、DomainExceptionを用いてアプリケーションのルール違反を処理する方法を示しています。DomainExceptionはプログラムの構文エラーではなく、「18歳未満はアクセス不可」といったビジネスルール上の問題を表現するのに適しています。throw new DomainException('エラー文')で例外を発生させると、そのエラー文がmessageプロパティに格納されます。このメッセージは、catchブロック内で$e->getMessage()メソッドを呼び出すことで安全に取得できます。最後に、PHPの変数をJavaScriptで表示する際はjson_encode()関数を使うことが重要です。この関数は、メッセージに記号が含まれていてもJavaScriptのエラーを引き起こさないよう適切に変換するため、安全性が高まります。
PHP DomainException を使ったメッセージキュー処理
1<?php 2 3declare(strict_types=1); 4 5/** 6 * メッセージキューを模倣し、ドメインルールに違反した場合に 7 * DomainException を使用するクラス。 8 */ 9class MessageQueueProcessor 10{ 11 /** @var array<int, array{type: string, payload: mixed}> メッセージを保持するキュー */ 12 private array $queue = []; 13 14 /** @var array<int, string> 許可されたメッセージタイプのリスト */ 15 private const ALLOWED_TYPES = ['send_email', 'process_payment']; 16 17 /** 18 * メッセージをキューに追加します。 19 * 20 * @param string $type メッセージのタイプ 21 * @param mixed $payload メッセージの内容 22 */ 23 public function push(string $type, mixed $payload): void 24 { 25 $this->queue[] = ['type' => $type, 'payload' => $payload]; 26 echo "メッセージを追加しました: タイプ='{$type}'" . PHP_EOL; 27 } 28 29 /** 30 * キューから次のメッセージを処理します。 31 * 32 * @throws DomainException 許可されていないメッセージタイプの場合 33 */ 34 public function processNext(): void 35 { 36 if (empty($this->queue)) { 37 echo "キューは空です。" . PHP_EOL; 38 return; 39 } 40 41 // 先頭のメッセージを取り出す (FIFO) 42 $message = array_shift($this->queue); 43 $type = $message['type']; 44 45 // ドメインルール: 許可されたメッセージタイプか検証する 46 if (!in_array($type, self::ALLOWED_TYPES, true)) { 47 // ルール違反の場合、DomainExceptionをスローする 48 throw new DomainException("処理できないメッセージタイプです: '{$type}'"); 49 } 50 51 echo "メッセージを処理中: タイプ='{$type}'" . PHP_EOL; 52 // 本来はここでメッセージに応じた処理を行う 53 } 54} 55 56// メッセージキュープロセッサのインスタンスを作成 57$processor = new MessageQueueProcessor(); 58 59// 有効なメッセージをキューに追加 60$processor->push('send_email', ['to' => 'user@example.com', 'subject' => 'ようこそ']); 61$processor->push('process_payment', ['user_id' => 123, 'amount' => 5000]); 62 63// ドメインルールに違反する無効なメッセージをキューに追加 64$processor->push('delete_user', ['user_id' => 456]); 65 66echo "-----------------------------------------" . PHP_EOL; 67echo "メッセージ処理を開始します..." . PHP_EOL; 68 69// キューが空になるまでメッセージを処理 70while (true) { 71 try { 72 $processor->processNext(); 73 } catch (DomainException $e) { 74 // DomainExceptionをキャッチし、そのメッセージ (messageプロパティ) を表示する 75 echo "[エラー発生] " . $e->getMessage() . PHP_EOL; 76 // エラーが発生したメッセージは処理されず、次のメッセージに進む 77 } catch (Exception $e) { 78 // その他の予期せぬエラー 79 echo "[予期せぬエラー] " . $e->getMessage() . PHP_EOL; 80 break; 81 } 82 83 // キューが空になったらループを抜ける(この例では無限ループを避けるため簡易的に実装) 84 // NOTE: より堅牢な実装では、キューのサイズをチェックするなどの方法が考えられます。 85 if (empty( 86 (new ReflectionClass($processor))->getProperty('queue')->getValue($processor) 87 )) { 88 break; 89 } 90} 91 92echo "メッセージ処理が完了しました。" . PHP_EOL; 93
このPHPサンプルコードは、メッセージキューの処理において、ビジネス上のルール(ドメインルール)に違反した場合に DomainException を使用する例を示しています。MessageQueueProcessorクラスは、許可されたメッセージタイプ(send_email、process_payment)のみを処理するよう設計されています。
processNextメソッド内で、許可されていないメッセージタイプ(この例では 'delete_user')を処理しようとすると、new DomainException("処理できないメッセージタイプです: '{$type}'") のように、具体的なエラー理由を文字列として渡して例外をスローします。この文字列が、DomainException オブジェクトの message プロパティに格納されます。
メイン処理の try...catch ブロックでは、このスローされた DomainException を $e という変数で捕捉します。そして、$e->getMessage() メソッドを呼び出すことで、message プロパティに格納されたエラーメッセージを取得し、画面に表示します。getMessage() メソッドは引数を取らず、戻り値として例外メッセージの文字列(string)を返します。
このコードを実行すると、無効なメッセージを処理する段階で「[エラー発生] 処理できないメッセージタイプです: 'delete_user'」と表示されます。このように、message プロパティは、プログラムのルールに違反した具体的な理由を伝えるために利用されます。
DomainExceptionは、プログラムの仕様やビジネスルールに違反した場合に使用する例外です。サンプルコードでは、許可されていないメッセージタイプを処理しようとした際に意図的に発生させています。throw new DomainException()の括弧内に指定した文字列が、エラーメッセージとしてmessageプロパティに格納されます。catchブロックで$e->getMessage()メソッドを使うことで、この具体的なエラー内容を取得できます。エラーの原因を特定できるよう、メッセージには何が問題だったのかが分かる情報を含めることが重要です。このようにエラーの種類に応じて適切な例外を使い分け、具体的なメッセージを設定することで、問題の発見が容易な堅牢なシステムを構築できます。