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

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

作成日: 更新日:

基本的な使い方

messageプロパティは、例外メッセージを保持するプロパティです。このプロパティには、例外がなぜスロー(発生)されたのかを説明するための、人間が読みやすい文字列が格納されます。通常、この値は new Exception() のようにして例外オブジェクトを生成する際に、コンストラクタの第一引数に文字列を渡すことで設定されます。例えば、「ファイルが見つかりません」や「データベース接続に失敗しました」といった具体的なエラー内容がこれにあたります。このプロパティは保護された(protected)プロパティであるため、クラスの外部から直接 ->message のようにアクセスすることはできず、公開されている getMessage() メソッドを通じて値を取得する必要があります。取得したメッセージは、エラーログへの記録、デバッグ時の原因究明、あるいはエンドユーザーへのエラー通知など、プログラムの異常系処理において重要な役割を果たします。開発者にとって、このメッセージは問題の特定と解決に不可欠な手がかりとなります。

構文(syntax)

1<?php
2
3try {
4    throw new Exception("これがエラーメッセージです。");
5} catch (Exception $e) {
6    echo $e->getMessage();
7}
8
9?>

引数(parameters)

引数なし

引数はありません

戻り値(return)

string

Exceptionクラスのmessageプロパティは、例外が発生した際のエラーメッセージを文字列で返します。

サンプルコード

MessageFormatterで動的エラーメッセージを生成する

1<?php
2
3declare(strict_types=1);
4
5/**
6 * MessageFormatterを使用してエラーメッセージを生成し、
7 * Exceptionのmessageプロパティに格納する例を示すクラス。
8 *
9 * このコードを実行するには、PHPのintl拡張機能が必要です。
10 */
11class UserRegistration
12{
13    /**
14     * ユーザーを登録します。年齢が不正な場合に例外をスローします。
15     *
16     * @param string $name ユーザー名
17     * @param int $age 年齢
18     * @throws \InvalidArgumentException 年齢が18歳未満の場合
19     */
20    public function register(string $name, int $age): void
21    {
22        // 年齢が18歳未満の場合は登録不可とし、例外をスローする
23        if ($age < 18) {
24            // MessageFormatterを使用して、動的な値を含むエラーメッセージを生成する。
25            // ICUメッセージ構文 '{0}' は1番目の引数、'{1, number}' は2番目の引数を数値としてフォーマットすることを示す。
26            $pattern = 'ユーザー "{0}" の登録に失敗しました。年齢は18歳以上である必要がありますが、指定された年齢は {1, number} 歳です。';
27            $errorMessage = MessageFormatter::formatMessage('ja_JP', $pattern, [$name, $age]);
28
29            // 生成したメッセージをExceptionのコンストラクタに渡す
30            throw new \InvalidArgumentException($errorMessage);
31        }
32
33        echo "ユーザー \"{$name}\" (年齢: {$age}歳) を正常に登録しました。" . PHP_EOL;
34    }
35}
36
37$registration = new UserRegistration();
38
39try {
40    // 正常に実行されるケース
41    $registration->register('山田太郎', 20);
42
43    // 例外が発生するケース
44    $registration->register('鈴木花子', 15);
45} catch (\InvalidArgumentException $e) {
46    // catchブロックでExceptionインスタンスを受け取る
47    // getMessage()メソッドで、コンストラクタに渡されたエラーメッセージ(messageプロパティの値)を取得して表示する
48    echo 'エラー: ' . $e->getMessage() . PHP_EOL;
49}

PHPのExceptionクラスが持つmessageプロパティは、発生したエラーの内容を説明する文字列を保持します。このプロパティの値は、Exceptionオブジェクトが生成される際に、コンストラクタの第一引数に渡された文字列によって設定されます。

サンプルコードは、ユーザー登録処理を例にしています。registerメソッド内で、登録条件(18歳以上)を満たさない場合にInvalidArgumentExceptionという例外をスローします。このとき、MessageFormatter::formatMessage関数を使い、ユーザー名や年齢といった動的な値を含む詳細なエラーメッセージ文字列を生成しています。そして、生成されたメッセージをInvalidArgumentExceptionのコンストラクタに渡すことで、messageプロパティにその内容が格納されます。

try-catch構文のcatchブロックで例外を捕捉した後、$e->getMessage()メソッドを呼び出すことでmessageプロパティの値を取得できます。getMessage()メソッドは引数を持たず、戻り値としてstring型のエラーメッセージを返します。これにより、エラーの原因を具体的に把握し、ログへの記録や利用者への通知などに活用することができます。

Exceptionクラスのmessageプロパティは、例外発生時のエラーメッセージを保持し、getMessage()メソッドでその値を取得します。このプロパティは読み取り専用であり、コンストラクタを通じて一度設定されたら直接変更はできません。

MessageFormatterを利用して動的なエラーメッセージを生成するには、PHPのintl拡張機能が事前にサーバーにインストールされている必要があります。環境によって有効化されていない場合があるため、使用前に確認が不可欠です。

MessageFormatter::formatMessageのパターンには、{0}のようなICUメッセージ構文を使用し、指定された引数とロケールに基づいてメッセージが整形されます。これにより、国際化対応や数値、日付の適切なフォーマットが容易になり、開発者がロケールごとの表現の違いを個別に考慮する必要が減ります。

このサンプルでは、try-catchによる例外処理の基本も示しており、プログラムの堅牢性を高めるために異常な状況を適切に捕捉し、ユーザーに分かりやすいメッセージを提示することが重要です。

PHP MessagePack デコード例外処理

1<?php
2
3declare(strict_types=1);
4
5/**
6 * MessagePackデータのデコードを試み、失敗時に例外メッセージを表示する
7 *
8 * この関数は、MessagePack形式のバイナリデータをデコードします。
9 * データが不正でデコードに失敗した場合、Exceptionをスローし、
10 * catchブロックでその例外オブジェクトの`message`プロパティ(getMessage()メソッド経由)を
11 * 取得してエラー内容を表示します。
12 *
13 * 注意: このコードを実行するには、MessagePack拡張機能 (`pecl install msgpack`) が必要です。
14 */
15function decodeMessagePackWithExceptionHandler(): void
16{
17    // 1. 正常にデコードできるMessagePackデータを作成
18    $validData = ['id' => 1, 'name' => 'example'];
19    $packedValidData = msgpack_pack($validData);
20
21    // 2. 意図的に破損させた、デコードに失敗するデータを作成
22    $packedInvalidData = "\x82\xA2id\x01\xA4name"; // 末尾が欠損した不正なデータ
23
24    // --- 正常なデータのデコード試行 ---
25    echo "--- Case 1: 正常なデータ ---" . PHP_EOL;
26    try {
27        $unpacked = msgpack_unpack($packedValidData);
28        if ($unpacked === false) {
29            // デコード関数がfalseを返した場合、カスタムエラーメッセージで例外をスロー
30            throw new Exception('MessagePackのデコードに失敗しました。');
31        }
32        echo "デコード成功: " . PHP_EOL;
33        print_r($unpacked);
34    } catch (Exception $e) {
35        // Exceptionクラスのインスタンス$eからエラーメッセージを取得して表示
36        // $e->message プロパティの値は getMessage() メソッドで取得するのが一般的です
37        echo "エラーメッセージ: " . $e->getMessage() . PHP_EOL;
38    }
39
40    echo PHP_EOL;
41
42    // --- 不正なデータのデコード試行 ---
43    echo "--- Case 2: 不正なデータ ---" . PHP_EOL;
44    try {
45        // msgpack_unpackは不正なデータに対してfalseを返し、E_WARNINGを発生させます
46        $unpacked = msgpack_unpack($packedInvalidData);
47        if ($unpacked === false) {
48            throw new Exception('MessagePackのデコードに失敗しました。データが破損している可能性があります。');
49        }
50        echo "デコード成功: " . PHP_EOL;
51        print_r($unpacked);
52    } catch (Exception $e) {
53        // tryブロック内でスローされた例外を捕捉し、エラーメッセージを表示
54        echo "エラーメッセージ: " . $e->getMessage() . PHP_EOL;
55    }
56}
57
58// 関数を実行
59decodeMessagePackWithExceptionHandler();

このPHPサンプルコードは、プログラム実行中にエラーが発生した際に、そのエラー内容を示すメッセージを取得する方法を解説するものです。PHPでは、エラーが発生した状況をExceptionオブジェクトとして扱います。

Exceptionクラスにはmessageというプロパティがあり、エラーに関する具体的な説明文を文字列で保持します。このメッセージは、new Exception('ここにエラーメッセージを設定'); のように、Exceptionオブジェクトを生成する際の引数として指定します。

サンプルコードでは、tryブロック内でMessagePackデータのデコードに失敗した場合、throw new Exception(...)によって、独自のエラーメッセージを持つExceptionオブジェクトを意図的に発生させています。

続くcatchブロックでは、発生したExceptionオブジェクトを$eという変数で受け取ります。そして、$e->getMessage()メソッドを呼び出すことで、messageプロパティに格納されている文字列を取得しています。このメソッドは引数を取らず、戻り値としてエラーメッセージの文字列 (string) を返します。最終的にそのメッセージを表示することで、プログラムで何が問題だったのかを具体的に知ることができます。

このコードは、try-catch構文を使ったエラー処理の基本例です。注意点として、msgpack_unpack関数はデコードに失敗しても直接例外を発生させず、falseという値を返します。そのため、コード内ではif文で返り値がfalseかを確認し、throw new Exception()と記述することで意図的に例外を発生させています。catchブロックは、このようにして発生した例外を捕捉します。捕捉した例外オブジェクト$eからエラーメッセージを取得する際は、プロパティ$e->messageに直接アクセスするよりも$e->getMessage()メソッドを使うのが一般的です。また、このコードの実行には、別途MessagePack拡張機能のインストールが必要です。

関連コンテンツ