【PHP8.x】LengthException::messageプロパティの使い方
messageプロパティの使い方について、初心者にもわかりやすく解説します。
基本的な使い方
messageプロパティは、例外に関する詳細な説明文を保持するプロパティです。このプロパティはLengthExceptionクラスが直接定義したものではなく、その基底クラスであるExceptionクラスから継承されています。そのため、PHPにおける多くの例外クラスで共通して利用される重要な要素です。messageプロパティの役割は、なぜ例外が発生したのか、その具体的な理由を人間が読んで理解できる文字列として格納することです。例えば、関数の引数として渡された配列の要素数が不正である場合に「要素数は5以上でなければなりません」といったエラーメッセージが設定されます。この値は、new LengthException()のようにして例外オブジェクトのインスタンスを生成する際、コンストラクタの第一引数に文字列を渡すことで設定されます。プロパティ自体は外部から直接アクセスできないprotectedなメンバーですが、公開されているgetMessage()メソッドを呼び出すことで、いつでもその値を取得できます。プログラムのデバッグ時やエラーログを記録する際にこのメッセージを取得することで、開発者はエラーの原因を迅速に特定するための重要な手がかりを得ることができます。
構文(syntax)
1<?php 2try { 3 // 長さが無効な場合にスローされる例外 4 throw new LengthException("無効な長さが指定されました。"); 5} catch (LengthException $e) { 6 // 例外オブジェクトからエラーメッセージを取得して表示します 7 echo $e->getMessage(); 8}
引数(parameters)
引数なし
引数はありません
戻り値(return)
string
LengthException クラスの message プロパティは、例外が発生した理由を示す文字列を返します。
サンプルコード
PHP LengthExceptionでエラーメッセージを表示する
1<?php 2 3declare(strict_types=1); 4 5/** 6 * 指定された長さの要件を検証し、満たさない場合はLengthExceptionをスローします。 7 * 8 * @param string $username 検証するユーザー名 9 * @param int $minLength 許容される最小文字数 10 * @throws LengthException ユーザー名が最小文字数に満たない場合 11 * @return void 12 */ 13function validateUsernameLength(string $username, int $minLength): void 14{ 15 if (mb_strlen($username) < $minLength) { 16 // 長さが足りない場合に、カスタムメッセージを付けて例外をスローする 17 throw new LengthException("ユーザー名は{$minLength}文字以上で入力してください。"); 18 } 19} 20 21// エラーメッセージを表示するためのHTMLとCSS 22echo <<<HTML 23<!DOCTYPE html> 24<html lang="ja"> 25<head> 26 <meta charset="UTF-8"> 27 <title>LengthException Message Example</title> 28 <style> 29 body { font-family: sans-serif; padding: 20px; } 30 .message-box { 31 border: 1px solid #ccc; 32 padding: 15px; 33 margin-top: 20px; 34 border-radius: 5px; 35 } 36 .error { 37 border-color: #d9534f; 38 background-color: #f2dede; 39 color: #a94442; 40 } 41 .success { 42 border-color: #5cb85c; 43 background-color: #dff0d8; 44 color: #3c763d; 45 } 46 </style> 47</head> 48<body> 49 <h1>ユーザー名検証</h1> 50HTML; 51 52try { 53 // 検証するユーザー名と最小文字数を設定 54 $inputUsername = 'admin'; 55 $requiredLength = 8; 56 57 echo "<p>入力されたユーザー名: '{$inputUsername}'</p>"; 58 echo "<p>要求される最小文字数: {$requiredLength}文字</p>"; 59 60 // 検証関数を呼び出す 61 validateUsernameLength($inputUsername, $requiredLength); 62 63 // 例外がスローされなかった場合のメッセージ 64 echo '<div class="message-box success">検証に成功しました。</div>'; 65 66} catch (LengthException $e) { 67 // LengthExceptionをキャッチする 68 // $e->getMessage() を使って、スローされた例外の 'message' プロパティを取得する 69 $errorMessage = htmlspecialchars($e->getMessage(), ENT_QUOTES, 'UTF-8'); 70 71 // 取得したエラーメッセージを「メッセージボックス」として表示する 72 echo '<div class="message-box error">エラー: ' . $errorMessage . '</div>'; 73} 74 75echo <<<HTML 76</body> 77</html> 78HTML;
このPHPサンプルコードは、LengthExceptionクラスが持つmessageプロパティを使い、エラーメッセージを取得して表示する方法を示しています。LengthExceptionは、文字列や配列などの長さが不正な場合に発生するエラー(例外)を表現するためのクラスです。
コード内のvalidateUsernameLength関数は、引数で受け取ったユーザー名の文字数が指定された最小文字数に満たない場合に、throw new LengthException(...)という構文を使って意図的に例外を発生させます。このとき、コンストラクタに渡した「ユーザー名は8文字以上で入力してください。」という文字列が、例外オブジェクトのmessageプロパティに設定されます。
プログラムのメイン処理はtry...catchブロックで囲まれています。tryブロック内で例外が発生すると、直ちにcatchブロックの処理に移行します。catch (LengthException $e)では、発生した例外オブジェクトを$eという変数で受け取ります。
messageプロパティの値を取得するには、$e->getMessage()メソッドを使用します。このメソッドは引数を取らず、戻り値としてmessageプロパティに格納されている文字列を返します。サンプルコードでは、この戻り値を受け取り、キーワードである「メッセージボックス」風のスタイルを適用したHTML要素内に出力することで、ユーザーにエラー内容を分かりやすく伝えています。
このコードは、例外処理というエラー対応の仕組みを学べます。tryブロック内でエラーが発生すると、処理はcatchブロックに移ります。catch (LengthException $e)では、LengthExceptionという種類のエラーだけを捕まえます。変数$eにはエラー情報が格納されており、$e->getMessage()で、エラー発生時に設定されたメッセージ文字列(messageプロパティの値)を取り出せます。
Webページにメッセージを表示する際は、htmlspecialchars()関数を使うことが重要です。これにより、悪意のあるHTMLタグやスクリプトが埋め込まれるのを防ぎ、セキュリティを高めます。また、日本語などを含む文字列の長さを数える場合は、strlen()ではなくmb_strlen()を使用するのが正しい方法です。
PHP LengthExceptionでメッセージ長さを検証する
1<?php 2 3declare(strict_types=1); 4 5/** 6 * シンプルなメッセージキューを模倣するクラス 7 * 8 * メッセージの長さを検証し、不正な場合は LengthException をスローします。 9 */ 10class SimpleMessageQueue 11{ 12 // 許容されるメッセージの最小長(バイト単位) 13 private const MIN_LENGTH = 10; 14 // 許容されるメッセージの最大長(バイト単位) 15 private const MAX_LENGTH = 256; 16 17 private array $queue = []; 18 19 /** 20 * メッセージをキューに追加します。 21 * 22 * @param string $message キューに追加するメッセージ 23 * @throws LengthException メッセージの長さが不正な場合 24 */ 25 public function enqueue(string $message): void 26 { 27 $length = strlen($message); 28 29 if ($length < self::MIN_LENGTH) { 30 // メッセージが短すぎるため、エラーメッセージを指定して例外をスローします。 31 throw new LengthException( 32 "メッセージが短すぎます。最小 " . self::MIN_LENGTH . " バイト必要ですが、{$length} バイトです。" 33 ); 34 } 35 36 if ($length > self::MAX_LENGTH) { 37 // メッセージが長すぎるため、エラーメッセージを指定して例外をスローします。 38 throw new LengthException( 39 "メッセージが長すぎます。最大 " . self::MAX_LENGTH . " バイトまでですが、{$length} バイトあります。" 40 ); 41 } 42 43 $this->queue[] = $message; 44 echo "メッセージを追加しました: '{$message}'" . PHP_EOL; 45 } 46} 47 48$messageQueue = new SimpleMessageQueue(); 49 50// 短すぎるメッセージをキューに追加しようと試みます。 51try { 52 $messageQueue->enqueue("短すぎ"); 53} catch (LengthException $e) { 54 // スローされた LengthException を捕捉します。 55 // getMessage() メソッドで例外の 'message' プロパティを取得し、表示します。 56 echo "エラーが発生しました: " . $e->getMessage() . PHP_EOL; 57} 58 59echo "--------------------" . PHP_EOL; 60 61// 正常な長さのメッセージをキューに追加します。 62try { 63 $messageQueue->enqueue("これは処理されるべき適切な長さのメッセージです。"); 64} catch (LengthException $e) { 65 echo "エラーが発生しました: " . $e->getMessage() . PHP_EOL; 66}
LengthExceptionが持つmessageプロパティは、長さに関するエラーが発生した際の具体的な理由を説明するための文字列を保持します。
このサンプルコードは、メッセージの長さが規定の範囲外である場合にLengthExceptionを発生させる、シンプルなメッセージキューのプログラムです。enqueueメソッド内でメッセージの長さを検証し、短すぎる、あるいは長すぎる場合にnew LengthException()を使って意図的に例外を発生させています。このとき、コンストラクタの引数に渡された「メッセージが短すぎます。」のような具体的な説明文が、messageプロパティに設定されます。
try...catch構文は、この例外を安全に処理するために使われます。エラーが発生するとcatchブロックでLengthExceptionオブジェクトが捕捉され、変数$eに代入されます。そして、$e->getMessage()メソッドを呼び出すことで、messageプロパティに格納されたエラーメッセージを取得し、画面に表示しています。このgetMessage()メソッドは引数を取らず、戻り値としてエラー内容の文字列(string)を返します。これにより、プログラムの実行が停止することなく、なぜエラーが起きたのかを具体的に知ることができます。
このコードは、関数の引数などが不正な長さである場合に LengthException というPHP標準の例外を発生させる例です。throw new LengthException() の括弧内に指定したエラー内容の文字列が、この例外オブジェクトの message プロパティに保存されます。try...catch 構文で例外を捕捉した際、$e->getMessage() メソッドを呼び出すことで、この保存されたメッセージ文字列を取得できます。これにより、エラーの原因を具体的にログ出力したり、ユーザーに通知したりできます。注意点として、strlen() 関数はバイト単位で長さを計算します。日本語などマルチバイト文字を文字数として数えたい場合は、代わりに mb_strlen() 関数を使う必要があることを覚えておきましょう。