【PHP8.x】BadMethodCallException::codeプロパティの使い方
codeプロパティの使い方について、初心者にもわかりやすく解説します。
基本的な使い方
『codeプロパティは、例外に関する追加情報を示す整数値である例外コードを保持するプロパティです。』このプロパティはBadMethodCallExceptionクラスが直接定義しているものではなく、PHPの全ての例外の元となるExceptionクラスから継承されたものです。したがって、BadMethodCallExceptionを含むほとんどの例外オブジェクトで利用することができます。例外コードの主な目的は、同じ種類の例外の中でも、発生した状況に応じてエラーを数値で細かく分類することです。開発者はBadMethodCallExceptionのインスタンスを生成する際、コンストラクタの第二引数に任意の整数を指定することで、独自の例外コードを設定できます。このコードを指定しない場合、デフォルト値として0が設定されます。例外を補足するcatchブロック内では、getCode()メソッドを使ってこの値を取得できます。取得したコードの値に応じて処理を分岐させることで、より詳細で柔軟なエラーハンドリングを実装することが可能になります。
構文(syntax)
1<?php 2 3try { 4 // 例外コード 100 を指定して BadMethodCallException をスローします。 5 throw new BadMethodCallException("メソッドの呼び出しに失敗しました。", 100); 6} catch (BadMethodCallException $e) { 7 // 捕捉した例外インスタンスから、設定された例外コードを取得します。 8 // public readonly int $code; 9 $errorCode = $e->getCode(); 10 11 echo "例外コード: " . $errorCode; // 出力: 例外コード: 100 12} 13 14?>
引数(parameters)
引数なし
引数はありません
戻り値(return)
int
BadMethodCallException クラスの code プロパティは、例外が発生した際の識別コードを表す整数値を返します。
サンプルコード
PHP BadMethodCallExceptionコード取得処理
1<?php 2 3declare(strict_types=1); 4 5/** 6 * CodeIgniterのモデルを模したユーザー管理クラス 7 * 8 * このクラスでは、未定義のメソッドが呼び出された際に、 9 * マジックメソッド __call を利用して BadMethodCallException をスローします。 10 */ 11class UserModel 12{ 13 /** 14 * 未定義のメソッドが呼び出されたときに自動的に実行されるマジックメソッド 15 * 16 * @param string $name 呼び出されようとしたメソッド名 17 * @param array $arguments メソッドに渡された引数 18 * @throws BadMethodCallException 常にスローされる 19 */ 20 public function __call(string $name, array $arguments): void 21 { 22 // 存在しないメソッドが呼び出されたことを示す例外をスローします。 23 // 第2引数にエラーコードを指定することで、例外の種類をプログラムで識別できます。 24 // ここでは、HTTPステータスコード 404 (Not Found) を模倣しています。 25 throw new BadMethodCallException( 26 "メソッド '{$name}' は UserModel クラスに存在しません。", 27 404 28 ); 29 } 30} 31 32/** 33 * CodeIgniterのコントローラーでの処理を模した実行部分 34 */ 35function runApplication(): void 36{ 37 $userModel = new UserModel(); 38 39 try { 40 // UserModelクラスに存在しないメソッド 'findByEmail' を意図的に呼び出す 41 echo "存在しないメソッドを呼び出します...\n"; 42 $userModel->findByEmail('test@example.com'); 43 } catch (BadMethodCallException $e) { 44 // BadMethodCallException を捕捉し、エラー情報を表示します。 45 echo "エラーを捕捉しました。\n"; 46 echo "----------------------------------------\n"; 47 echo "例外クラス: " . get_class($e) . "\n"; 48 echo "メッセージ: " . $e->getMessage() . "\n"; 49 50 // Exception::getCode() メソッドで、例外生成時に設定されたコードを取得します。 51 $errorCode = $e->getCode(); 52 echo "エラーコード: " . $errorCode . "\n"; 53 54 // 取得したエラーコードに基づいて処理を分岐させることができます。 55 if ($errorCode === 404) { 56 echo "処理結果: 指定された操作は見つかりませんでした。\n"; 57 } else { 58 echo "処理結果: 予期せぬエラーが発生しました。\n"; 59 } 60 echo "----------------------------------------\n"; 61 } 62} 63 64// アプリケーションの実行 65runApplication();
このPHPサンプルコードは、BadMethodCallExceptionに設定されたエラーコードを取得し、それを利用して処理を分岐させる方法を示しています。
UserModelクラスでは、__callマジックメソッドを利用して、存在しないメソッドが呼び出された場合にBadMethodCallExceptionを意図的に発生させています。このとき、コンストラクタの第2引数にエラーコードとして整数値(この例では404)を渡しています。
runApplication関数では、try...catch構文を使ってこの例外を捕捉します。catchブロックで受け取った例外オブジェクト($e)に対してgetCode()メソッドを実行すると、例外発生時に設定されたエラーコードを取得できます。getCode()メソッドは引数を取らず、戻り値として整数(int)のエラーコードを返します。
サンプルコードでは、取得したエラーコードが404であるかどうかをif文で判定し、その結果に基づいて表示するメッセージを変更しています。このように、エラーコードを活用することで、単にエラーを検知するだけでなく、エラーの種類を識別して、より具体的で適切なエラーハンドリングを実装することが可能になります。
このコードは、存在しないメソッドが呼ばれた際に__callマジックメソッドを利用して意図的に例外を発生させています。注意点は、BadMethodCallExceptionを生成する際に第2引数で指定するエラーコードです。このコードは整数値であり、catchブロック内でgetCode()メソッドを使って取得できます。エラーメッセージの文字列で処理を判断するよりも、このエラーコードで処理を分岐させる方が、メッセージの変更に影響されず安定したプログラムになります。どのようなコードをどのエラーに対応させるかは、HTTPステータスコードを参考にしたり、プロジェクト内で独自のルールを定めたりして、一貫性を持たせることが重要です。
BadMethodCallExceptionのコードを取得する
1<?php 2 3/** 4 * 存在しないメソッド呼び出しを動的に処理するクラス 5 */ 6class DynamicMethodHandler 7{ 8 /** 9 * 未定義のメソッドが呼び出されたときに自動的にコールされるマジックメソッド 10 * 11 * @param string $name 呼び出されたメソッド名 12 * @param array $arguments メソッドに渡された引数の配列 13 * @throws BadMethodCallException 特定のメソッド名が呼び出された場合にスローされる 14 */ 15 public function __call(string $name, array $arguments): void 16 { 17 // 'secretAction'というメソッドが呼ばれた場合、例外をスローする 18 if ($name === 'secretAction') { 19 // 例外メッセージとカスタムの例外コード(403)を指定して例外をスロー 20 throw new BadMethodCallException( 21 '許可されていないメソッド呼び出しです。', 22 403 23 ); 24 } 25 26 echo "呼び出されたメソッド: {$name}" . PHP_EOL; 27 } 28} 29 30$handler = new DynamicMethodHandler(); 31 32try { 33 // 許可されていないメソッドを呼び出し、意図的に例外を発生させる 34 $handler->secretAction(); 35} catch (BadMethodCallException $e) { 36 // catchブロックで BadMethodCallException を捕捉する 37 38 // 例外オブジェクトからメッセージを取得して表示 39 echo "エラーメッセージ: " . $e->getMessage() . PHP_EOL; 40 41 // 例外オブジェクトの code プロパティ(getCode()メソッド)から 42 // 例外コードを取得して表示 43 // この例では、スロー時に指定した 403 が返される 44 echo "例外コード: " . $e->getCode() . PHP_EOL; 45}
このサンプルコードは、PHPのBadMethodCallExceptionが持つcodeプロパティの役割と使い方を解説するものです。codeプロパティには、例外発生時に設定された整数値(例外コード)が格納され、通常はgetCode()メソッドを通じて取得します。
コードでは、存在しないメソッドが呼び出された際に自動的に実行される__callマジックメソッドを定義しています。この中で、特定のメソッド名('secretAction')が呼び出された場合、BadMethodCallExceptionを意図的にスローしています。その際、コンストラクタの第2引数に例外コードとして403という整数値を指定しています。
try...catchブロックでこの例外を捕捉した後、例外オブジェクトのgetCode()メソッドを呼び出しています。このメソッドは引数を持たず、戻り値として、例外がスローされたときに設定された整数(int)型の例外コードを返します。この例では403が取得され、画面に表示されます。このように例外コードを利用することで、エラーメッセージの文字列に頼らずにエラーの種類を数値で判別し、処理を分岐させることが可能になります。
例外コードを取得する際は、$e->code のようにプロパティへ直接アクセスするのではなく、必ず getCode() メソッドを使用します。この例外コードは、単なるエラーメッセージとは異なり、エラーの種類をプログラムが識別するための数値です。HTTPステータスコード(例: 403)のように、アプリケーション内で意味を持つ数値を設定することで、catch ブロック内でコードの値に応じた条件分岐といった、より具体的なエラー処理を実装できます。なお、__call は動的な処理に便利ですが、多用するとコードが複雑になり、IDEの補完機能などが効きにくくなるため、利用は慎重に検討することが推奨されます。