【PHP8.x】LengthException::codeプロパティの使い方
codeプロパティの使い方について、初心者にもわかりやすく解説します。
基本的な使い方
『codeプロパティは、例外に関連付けられた整数コードを保持するプロパティです』
このプロパティはLengthExceptionクラスが直接定義するものではなく、その基底クラスであるExceptionクラスから継承されています。そのため、PHPの多くの標準的な例外クラスで共通して利用することが可能です。このプロパティの主な目的は、例外メッセージの文字列だけでは区別しにくいエラーの具体的な原因を、プログラムが識別可能な数値コードとして提供することにあります。LengthExceptionのインスタンスを作成する際、コンストラクタの第2引数に整数を渡すことで、このcodeプロパティに値を設定できます。もし引数を省略した場合は、デフォルト値として0が設定されます。例えば、入力された文字列が短すぎるエラーにはコード10、長すぎるエラーにはコード20を設定するなど、独自のルールを定義できます。catchブロックで例外を捕捉した後、getCode()メソッドを使ってこの値を取得し、その数値に応じて処理を分岐させることで、より詳細で柔軟なエラーハンドリングを実装することが可能になります。
構文(syntax)
1<?php 2 3function validate_length(string $value) 4{ 5 if (strlen($value) < 10) { 6 // 第2引数でエラーコードを指定して、例外をスローする 7 throw new LengthException("文字列が短すぎます。", 400); 8 } 9} 10 11try { 12 validate_length("test"); 13} catch (LengthException $e) { 14 // getCode()メソッドで、スローされた例外のコードを取得する 15 $errorCode = $e->getCode(); 16 echo "エラーコード: " . $errorCode; 17} 18 19?>
引数(parameters)
引数なし
引数はありません
戻り値(return)
int
LengthException クラスの code プロパティは、例外が発生した際の数値コードを整数型 (int) で返します。
サンプルコード
PHPにおけるLengthExceptionのcodeプロパティ活用
1<?php 2 3declare(strict_types=1); 4 5/** 6 * CodeIgniterのバリデーション処理を模したクラスです。 7 * 8 * ユーザー名の長さを検証し、不適切な場合にLengthExceptionをスローします。 9 * 例外に設定されたエラーコード(code)に応じて、処理を分岐させる方法を示します。 10 */ 11class SimpleUserValidator 12{ 13 // ユーザー名の最小文字数 14 private const MIN_USERNAME_LENGTH = 4; 15 // ユーザー名の最大文字数 16 private const MAX_USERNAME_LENGTH = 20; 17 18 // エラーコードの定数定義: 短すぎる場合 19 private const ERROR_CODE_TOO_SHORT = 1001; 20 // エラーコードの定数定義: 長すぎる場合 21 private const ERROR_CODE_TOO_LONG = 1002; 22 23 /** 24 * ユーザー登録処理を実行します。 25 * 内部でユーザー名の長さを検証し、例外を処理します。 26 * 27 * @param string $username 登録するユーザー名 28 */ 29 public function registerUser(string $username): void 30 { 31 echo "ユーザー名 '{$username}' の検証を開始します..." . PHP_EOL; 32 33 try { 34 // ユーザー名の長さを検証する 35 $this->validateUsernameLength($username); 36 37 // 検証が成功した場合の処理 38 echo "-> 検証成功: ユーザー '{$username}' は登録可能です。" . PHP_EOL; 39 } catch (LengthException $e) { 40 // LengthException がスローされた場合の処理 41 echo "-> 検証エラー: " . $e->getMessage() . PHP_EOL; 42 43 // LengthExceptionオブジェクトから `code` プロパティの値を取得します。 44 // getCode() メソッドは親のExceptionクラスから継承したもので、整数(int)を返します。 45 $errorCode = $e->getCode(); 46 47 echo "-> エラーコード: " . $errorCode . PHP_EOL; 48 49 // 取得したエラーコードに応じて、後続の処理を分岐させます。 50 switch ($errorCode) { 51 case self::ERROR_CODE_TOO_SHORT: 52 echo "-> 対応策: 入力フォームに「{$this->MIN_USERNAME_LENGTH}文字以上で入力してください」と表示します。" . PHP_EOL; 53 break; 54 case self::ERROR_CODE_TOO_LONG: 55 echo "-> 対応策: 入力フォームに「{$this->MAX_USERNAME_LENGTH}文字以内で入力してください」と表示します。" . PHP_EOL; 56 break; 57 default: 58 echo "-> 対応策: 予期せぬ長さ関連のエラーです。システム管理者に通知します。" . PHP_EOL; 59 break; 60 } 61 } finally { 62 echo "----------------------------------------" . PHP_EOL; 63 } 64 } 65 66 /** 67 * ユーザー名の長さが適切か検証します。 68 * 69 * @param string $username 検証対象のユーザー名 70 * @throws LengthException 長さが不正な場合にスローされます 71 */ 72 private function validateUsernameLength(string $username): void 73 { 74 $length = mb_strlen($username); 75 76 if ($length < self::MIN_USERNAME_LENGTH) { 77 // 文字数が足りない場合、エラーメッセージとエラーコードを指定して例外をスロー 78 throw new LengthException( 79 "ユーザー名が短すぎます。", 80 self::ERROR_CODE_TOO_SHORT 81 ); 82 } 83 84 if ($length > self::MAX_USERNAME_LENGTH) { 85 // 文字数が多すぎる場合、エラーメッセージとエラーコードを指定して例外をスロー 86 throw new LengthException( 87 "ユーザー名が長すぎます。", 88 self::ERROR_CODE_TOO_LONG 89 ); 90 } 91 } 92} 93 94// クラスのインスタンスを作成 95$validator = new SimpleUserValidator(); 96 97// 1. 正常な長さのユーザー名で実行 98$validator->registerUser('codeigniter_user'); 99 100// 2. 短すぎるユーザー名で実行 (LengthException がスローされる) 101$validator->registerUser('php'); 102 103// 3. 長すぎるユーザー名で実行 (LengthException がスローされる) 104$validator->registerUser('this_is_a_very_long_framework_user_name');
このPHPサンプルコードは、LengthExceptionが持つcodeプロパティを利用して、エラーの種類に応じた処理を分岐させる方法を解説しています。
LengthExceptionオブジェクトには、例外の具体的な原因を識別するための数値(エラーコード)を格納するcodeというプロパティがあります。このcodeプロパティの値は、getCode()メソッドを呼び出すことで取得できます。getCode()メソッドは引数を取らず、戻り値として整数(int)のエラーコードを返します。
コード内のvalidateUsernameLengthメソッドでは、ユーザー名の長さが不正な場合にLengthExceptionをthrow(スロー)しています。その際、new LengthException()の第二引数に、独自に定義したエラーコード(1001や1002)を指定し、例外オブジェクトにエラーの種類を記録しています。
registerUserメソッドのcatchブロックでは、この例外を捕捉し、$e->getCode()で設定されたエラーコードを取得します。そしてswitch文を使い、コードの値に応じて「文字数が短すぎる」または「長すぎる」といった、具体的な状況に合わせたエラーメッセージを表示しています。このようにエラーコードを活用する手法は、CodeIgniterのようなフレームワークで入力値の検証を行う際に、エラーの種類ごとに処理を制御する実践的なテクニックとして応用できます。
getCode()メソッドは、例外発生時に設定された整数値のエラーコードを取得します。例外をthrowする際、コンストラクタの第2引数に独自のコードを指定することで、catchブロックでその値を受け取れます。エラーメッセージの文言は変更される可能性がありますが、エラーコードを使えば、プログラムが特定の数値で処理を正確に分岐させることが可能です。これにより、より安定的で保守性の高いエラーハンドリングが実現できます。サンプルコードのように、エラーコードを定数として定義し、意味の分からない数値(マジックナンバー)を避けることは、コードの可読性を高める上で非常に重要です。この仕組みは、CodeIgniter等のフレームワークでエラーに応じた処理を制御する際にも応用されています。
PHPでユーザー名長さを検証し例外を発生させる
1<?php 2 3declare(strict_types=1); 4 5/** 6 * ユーザー名の長さを検証するクラス 7 * 8 * このコードは PHP_CodeSniffer と PSR-12 コーディング規約に準拠しています。 9 */ 10class UsernameValidator 11{ 12 // 許容されるユーザー名の最小長 13 private const MIN_LENGTH = 8; 14 // 許容されるユーザー名の最大長 15 private const MAX_LENGTH = 20; 16 17 // エラーコード: 短すぎる場合 18 public const ERROR_CODE_TOO_SHORT = 1001; 19 // エラーコード: 長すぎる場合 20 public const ERROR_CODE_TOO_LONG = 1002; 21 22 /** 23 * ユーザー名の文字列長を検証します。 24 * 長さが不正な場合は、エラー内容に応じた code を持つ LengthException をスローします。 25 * 26 * @param string $username 検証するユーザー名 27 * @throws LengthException 文字列長が不正な場合にスローされる 28 */ 29 public function validate(string $username): void 30 { 31 $length = mb_strlen($username); 32 33 if ($length < self::MIN_LENGTH) { 34 // 長さが最小値に満たない場合、エラーコードを付けて例外をスロー 35 throw new LengthException( 36 'ユーザー名が短すぎます。', 37 self::ERROR_CODE_TOO_SHORT 38 ); 39 } 40 41 if ($length > self::MAX_LENGTH) { 42 // 長さが最大値を超える場合、エラーコードを付けて例外をスロー 43 throw new LengthException( 44 'ユーザー名が長すぎます。', 45 self::ERROR_CODE_TOO_LONG 46 ); 47 } 48 } 49} 50 51// バリデーターのインスタンスを作成 52$validator = new UsernameValidator(); 53 54// 検証するユーザー名のリスト 55$usernames = [ 56 'short', // 短すぎるため例外が発生する 57 'valid_username', // 適切な長さ 58 'this_is_a_very_long_name', // 長すぎるため例外が発生する 59]; 60 61foreach ($usernames as $username) { 62 try { 63 // 検証を実行 64 $validator->validate($username); 65 echo "[OK] '{$username}' は有効な長さです。" . PHP_EOL; 66 } catch (LengthException $e) { 67 // LengthException をキャッチ 68 // getCode() メソッドで例外に設定された整数コードを取得 69 $errorCode = $e->getCode(); 70 echo "[NG] '{$username}' は無効な長さです。" . PHP_EOL; 71 echo " - エラーコード: {$errorCode}" . PHP_EOL; 72 echo " - メッセージ: " . $e->getMessage() . PHP_EOL; 73 } 74}
このPHPサンプルコードは、例外処理においてエラーの種類を識別するためにLengthExceptionのcodeプロパティを利用する方法を示しています。codeプロパティは、PHPの基本的なExceptionクラスから継承されたもので、例外に整数値のエラーコードを関連付けるために使用されます。
UsernameValidatorクラスでは、ユーザー名の長さが不正な場合にLengthExceptionをスローします。その際、コンストラクタの第2引数に、エラーの原因を示す独自の整数コード(短すぎる場合は1001、長すぎる場合は1002)を指定しています。
try-catchブロックで例外を捕捉した後、$e->getCode()メソッドを呼び出すことで、この設定されたエラーコードを取得できます。getCode()メソッドに引数はなく、戻り値として整数(int)型のコードが返されます。サンプルコードでは、この戻り値を使ってエラーコードを表示しています。このようにエラーコードを利用することで、エラーメッセージの文字列内容に依存せず、発生した例外の具体的な種類を機械的に判別し、コードに応じた適切な後続処理を行うことが可能になります。
このコードは、例外処理におけるエラーコードの正しい使い方を示しています。try...catchブロックで例外を捕捉した際、getMessage()は人間向けのメッセージ文字列を返しますが、getCode()はプログラムでの処理分岐に便利な整数コードを返します。このサンプルでは、エラーの種類(短すぎる/長すぎる)に応じて異なるコードを設定しているため、catchした後にエラーの種類を正確に判別できます。エラーコードを直接数値で記述せず、constで意味のある名前の定数として定義すると、コードの可読性と保守性が向上します。また、日本語のようなマルチバイト文字を扱う可能性がある場合、文字数を正しく数えるためにstrlen()ではなくmb_strlen()関数を使用することが重要です。