【PHP8.x】LengthException::getMessage()メソッドの使い方
getMessageメソッドの使い方について、初心者にもわかりやすく解説します。
基本的な使い方
getMessageメソッドは、例外が発生した際に設定されたエラーメッセージを取得する処理を実行するメソッドです。このメソッドは、PHPの基本的な例外クラスであるExceptionクラスで定義されており、LengthExceptionクラスはこれを継承することで利用します。LengthExceptionは、主に文字列や配列などの長さが不正であることを示すエラーが発生した際にスローされる例外です。例外を生成する際、new LengthException('長さが5文字以上でなければなりません') のように、コンストラクタの第一引数にエラーの詳細を説明する文字列を渡します。その後、try...catch構文でこの例外オブジェクトを捕捉し、そのオブジェクトに対してgetMessageメソッドを呼び出すと、コンストラクタで設定したエラーメッセージ文字列が返されます。この返されたメッセージは、エラーログに記録したり、画面に表示したりすることで、開発者がエラーの原因を迅速に特定し、デバッグ作業を行う上で重要な役割を果たします。なお、このメソッドはfinalとして宣言されているため、継承先のクラスで処理を上書きすることはできません。
構文(syntax)
1<?php 2 3try { 4 $data = "too short"; 5 if (strlen($data) < 20) { 6 // 長さが不適切な場合に LengthException をスローします。 7 throw new LengthException("データは20文字以上である必要があります。"); 8 } 9} catch (LengthException $e) { 10 // catchした例外オブジェクトから、設定されたエラーメッセージを取得して表示します。 11 echo $e->getMessage(); 12} 13 14?>
引数(parameters)
引数なし
引数はありません
戻り値(return)
string
このメソッドは、例外が発生した際に表示されるエラーメッセージを文字列で返します。
サンプルコード
PHP LengthException getMessageでエラーメッセージを取得する
1<?php 2 3/** 4 * 指定された文字列の長さが有効な範囲内にあるか検証します。 5 * 6 * @param string $password 検証する文字列(例: パスワード) 7 * @return void 8 * @throws LengthException 文字列の長さが8文字未満の場合 9 */ 10function validatePasswordLength(string $password): void 11{ 12 // 文字列の長さを取得 13 $length = strlen($password); 14 15 // 長さが8文字未満の場合、エラーメッセージを付けてLengthExceptionをスロー(発生)させる 16 if ($length < 8) { 17 throw new LengthException('パスワードは8文字以上である必要があります。'); 18 } 19} 20 21try { 22 // 短すぎるパスワードで関数を呼び出し、意図的に例外を発生させる 23 $shortPassword = 'pass'; 24 echo "パスワード '{$shortPassword}' を検証します..." . PHP_EOL; 25 validatePasswordLength($shortPassword); 26 27 // この行は例外がスローされるため実行されない 28 echo 'パスワードは有効です。' . PHP_EOL; 29 30} catch (LengthException $e) { 31 // tryブロック内でLengthExceptionが発生した場合、ここで処理を捕捉する 32 echo 'エラーを捕捉しました。' . PHP_EOL; 33 34 // getMessage()メソッドを使い、例外オブジェクトに格納されたエラーメッセージを取得して表示する 35 // -> "パスワードは8文字以上である必要があります。" と表示される 36 echo 'エラーメッセージ: ' . $e->getMessage() . PHP_EOL; 37} 38 39?>
LengthExceptionクラスのgetMessageメソッドは、例外オブジェクトに格納されているエラーメッセージを取得するために使用します。このメソッドは引数を取らず、戻り値としてエラーメッセージの文字列(string)を返します。
サンプルコードでは、まずvalidatePasswordLengthという関数を定義しています。この関数は、引数で受け取ったパスワードの文字列長が8文字未満の場合にLengthExceptionを意図的に発生させます。その際、new LengthException()の引数に「パスワードは8文字以上である必要があります。」という具体的なエラーメッセージ文字列を渡して、例外オブジェクトを生成しています。
次にtry...catchブロックで、この例外処理の流れを確認します。tryブロック内で、わざと短いパスワード'pass'を渡してvalidatePasswordLength関数を呼び出すと、LengthExceptionが発生します。すると、プログラムの制御はcatchブロックに移り、発生した例外オブジェクトが変数$eに格納されます。
最後に、$e->getMessage()を呼び出すことで、例外オブジェクトが生成されたときに設定されたエラーメッセージ「パスワードは8文字以上である必要があります。」を取得し、画面に出力しています。このようにgetMessageメソッドは、エラー発生時にその具体的な原因を把握し、ユーザーに通知したりログに記録したりするために役立ちます。
getMessage()メソッドは、例外をthrowする際にコンストラクタに渡した文字列を返します。このサンプルコードでは「パスワードは8文字以上である必要があります。」という文字列がそれに該当します。throwされた例外は、try...catch構文で捕捉しないとプログラムがそこで停止してしまうため、セットで使うことが基本です。catchブロックでは、LengthExceptionのように捕捉したい例外のクラスを正確に指定することが重要です。取得したエラーメッセージは、主にデバッグ時の情報源やログへの記録に利用します。ユーザーにそのまま表示すると意図しない情報が漏れる可能性があるため、内容は慎重に検討してください。
PHP LengthException::getMessageのオーバーライド
1<?php 2 3declare(strict_types=1); 4 5/** 6 * ユーザー名の長さが不正な場合にスローされるカスタム例外クラス。 7 * LengthException を継承し、getMessage() をオーバーライドして、 8 * より詳細なエラーメッセージを生成します。 9 */ 10class InvalidUsernameLengthException extends LengthException 11{ 12 /** 13 * @param int $actualLength 入力されたユーザー名の実際の長さ 14 * @param int $minLength 許容される最小長 15 * @param int $maxLength 許容される最大長 16 */ 17 public function __construct( 18 private int $actualLength, 19 private int $minLength, 20 private int $maxLength 21 ) { 22 // 親クラスのコンストラクタを呼び出す 23 parent::__construct('ユーザー名の長さが不正です。'); 24 } 25 26 /** 27 * 例外メッセージを生成するメソッドをオーバーライドします。 28 * 29 * @return string 状況に応じた詳細なエラーメッセージ 30 */ 31 public function getMessage(): string 32 { 33 return sprintf( 34 'ユーザー名は %d 文字以上 %d 文字以下である必要がありますが、%d 文字でした。', 35 $this->minLength, 36 $this->maxLength, 37 $this->actualLength 38 ); 39 } 40} 41 42/** 43 * ユーザー名の長さを検証し、不正な場合はカスタム例外をスローします。 44 * 45 * @param string $username 検証するユーザー名 46 * @throws InvalidUsernameLengthException 文字列長が指定範囲外の場合 47 */ 48function validateUsername(string $username): void 49{ 50 $minLength = 4; 51 $maxLength = 12; 52 $length = mb_strlen($username); 53 54 if ($length < $minLength || $length > $maxLength) { 55 // 長さが不正な場合、カスタム例外をインスタンス化してスロー 56 throw new InvalidUsernameLengthException($length, $minLength, $maxLength); 57 } 58 59 echo "ユーザー名 '{$username}' は有効です。" . PHP_EOL; 60} 61 62// --- 実行コード --- 63try { 64 // 短すぎるユーザー名で関数を呼び出し、例外を発生させる 65 validateUsername('a'); 66} catch (InvalidUsernameLengthException $e) { 67 // catchブロックでカスタム例外を捕捉し、オーバーライドされたgetMessage()を呼び出す 68 echo 'エラー: ' . $e->getMessage() . PHP_EOL; 69} 70 71try { 72 // 有効なユーザー名で関数を呼び出す 73 validateUsername('my_username'); 74} catch (InvalidUsernameLengthException $e) { 75 // このブロックは実行されない 76 echo 'エラー: ' . $e->getMessage() . PHP_EOL; 77}
このPHPコードは、例外処理におけるgetMessage()メソッドのオーバーライドを実演するものです。getMessage()は、例外オブジェクトが持つエラーメッセージを文字列として取得するためのメソッドです。このメソッドは引数を持たず、戻り値としてエラー内容を表す文字列(string)を返します。
サンプルコードでは、PHPに組み込まれているLengthExceptionを継承して、InvalidUsernameLengthExceptionという独自の例外クラスを定義しています。このカスタムクラスの中でgetMessage()メソッドを再定義(オーバーライド)することで、より状況に即した詳細なエラーメッセージを生成できるようにしています。
具体的には、ユーザー名の長さが不正だった場合に、コンストラクタで受け取った実際の文字数、許容される最小・最大文字数の情報を使用します。そして、オーバーライドされたgetMessage()メソッドがこれらの情報に基づいて「ユーザー名は 4 文字以上 12 文字以下である必要がありますが、1 文字でした。」のような、動的で分かりやすいメッセージ文字列を返却します。
try-catch構文でこの独自の例外を捕捉し、$e->getMessage()を呼び出すと、このカスタマイズされたメッセージが取得され、利用者や開発者に対して、より具体的で有益なエラー内容を伝えることが可能になります。
このコードは、エラー内容をより具体的に伝えるために、getMessage()メソッドを独自に書き換える「オーバーライド」という手法を使っています。親クラスのgetMessage()は、最初に設定した固定のメッセージしか返せません。しかし、このサンプルのようにオーバーライドすることで、実際の文字数や許容範囲など、状況に応じた詳細な情報を含んだメッセージを動的に生成できます。これにより、エラーの原因が格段に分かりやすくなります。
また、子クラスのコンストラクタ内でparent::__construct()を呼び出すことは、親クラスの初期化処理を確実に行うための重要なお作法です。エラーの種類に応じてLengthExceptionのような適切な組み込み例外を継承することで、コードの意図が明確になり、catch文で特定のエラーのみを捕捉しやすくなるという利点もあります。