【PHP8.x】BadMethodCallException::__construct()メソッドの使い方
__constructメソッドの使い方について、初心者にもわかりやすく解説します。
基本的な使い方
『__constructメソッドは、BadMethodCallExceptionクラスの新しいインスタンスを生成し、初期化する処理を実行するメソッドです。これはPHPにおけるコンストラクタとして機能し、new BadMethodCallException()のようにオブジェクトが作成される際に自動的に呼び出されます。BadMethodCallExceptionは、プログラムの実行時に、存在しないメソッドや、スコープ外のためアクセスできないメソッドが呼び出されたという論理的なエラーを示すための例外クラスです。このコンストラクタは、例外に関する詳細な情報を提供するために、主に3つの引数を受け取ります。第一引数には例外の理由を説明するエラーメッセージ文字列を、第二引数には例外を識別するための整数コードを指定します。第三引数には、この例外がスローされる直前に発生した別の例外オブジェクトを指定することができ、例外の連鎖(チェーン)を表現するために使用されます。これらの引数を用いて初期化された例外オブジェクトは、throwキーワードによってスローされ、catchブロックで捕捉することで、詳細なエラーハンドリングやデバッグに役立てられます。
構文(syntax)
1public __construct(string $message = "", int $code = 0, ?Throwable $previous = null)
引数(parameters)
string $message = '', int $code = 0, ?Throwable $previous = null
- string $message: 例外発生時の詳細を示すメッセージ
- int $code: 例外に付与するエラーコード
- ?Throwable $previous: この例外を発生させた、先行する例外オブジェクト。存在しない場合は null
戻り値(return)
戻り値なし
戻り値はありません
サンプルコード
PHPクラスコンストラクタでプロパティを初期化する
1<?php 2 3declare(strict_types=1); 4 5/** 6 * ユーザー情報を表すクラス 7 * 8 * このクラスは、インスタンスが生成される際にコンストラクタ (__construct) を通じて 9 * ユーザーの名前と年齢を初期化します。 10 */ 11class User 12{ 13 /** 14 * クラスのコンストラクタ (PHP 8 の Constructor Property Promotion を使用) 15 * 16 * インスタンス生成時 (new User(...)) に自動的に呼び出されます。 17 * 引数で受け取った値を、同名の public プロパティに自動で設定します。 18 * 19 * @param string $name ユーザー名 20 * @param int $age 年齢 21 */ 22 public function __construct( 23 public string $name, 24 public int $age 25 ) { 26 // コンストラクタプロパティ昇格により、このブロック内に 27 // $this->name = $name; のような代入コードを書く必要はありません。 28 } 29 30 /** 31 * 自己紹介文を生成して返すメソッド 32 * 33 * @return string 34 */ 35 public function getProfile(): string 36 { 37 return "私の名前は{$this->name}、{$this->age}歳です。"; 38 } 39} 40 41// 'new' キーワードで User クラスのインスタンスを生成します。 42// このとき、コンストラクタ (__construct) が呼び出され、引数がプロパティに設定されます。 43$user = new User('Taro Yamada', 30); 44 45// コンストラクタによって初期化されたプロパティの値を出力します。 46echo $user->name . PHP_EOL; 47 48// メソッドを呼び出して、自己紹介文を出力します。 49echo $user->getProfile() . PHP_EOL; 50
__constructは、クラスの「コンストラクタ」と呼ばれる特別なメソッドです。このメソッドは、newキーワードを使ってクラスからインスタンス(オブジェクト)を生成する際に、自動的に一度だけ呼び出されます。主な役割は、生成されたインスタンスが持つプロパティ(データ)を初期化し、利用可能な状態に準備することです。
サンプルコードのUserクラスでは、new User('Taro Yamada', 30)と記述した瞬間に__constructメソッドが実行されます。このとき、引数として渡された文字列'Taro Yamada'が$nameプロパティに、数値の30が$ageプロパティにそれぞれ自動で設定されます。
このコードで利用されているPHP 8の「コンストラクタプロパティ昇格」という機能は、コンストラクタの引数でプロパティの宣言と値の代入を同時に行えるようにするものです。これにより、従来必要だった$this->name = $name;といった記述を省略でき、コードがより簡潔になります。
コンストラクタはインスタンスの初期化を専門に行うため、特定の値を返すreturn文は記述せず、戻り値はありません。
__constructは、クラスからインスタンスが生成される際に自動で呼び出される特別な初期化メソッドです。このサンプルコードで使われている引数にpublicを付ける書き方は、PHP 8で導入された「コンストラクタプロパティ昇格」です。これにより、プロパティ宣言と値の代入を同時に行え、コードが簡潔になります。この機能はPHP 8以降でしか使えない点に注意してください。インスタンスを生成する際は、コンストラクタで定義された引数の数と型を正確に渡す必要があります。もし引数が不足したり型が異なったりするとエラーが発生します。型を明記することで、意図しないデータが設定されるのを防ぎ、コードの信頼性を高めることができます。
BadMethodCallExceptionコンストラクタで例外をスローする
1<?php 2 3declare(strict_types=1); 4 5/** 6 * 存在しないメソッドが呼び出された際に、 7 * BadMethodCallExceptionをスローするサンプルクラスです。 8 */ 9class DynamicCaller 10{ 11 /** 12 * 未定義のメソッドが呼び出されたときに自動的に実行されるマジックメソッド。 13 * 14 * @param string $name 呼び出されたメソッド名 15 * @param array $arguments メソッドに渡された引数の配列 16 * @throws BadMethodCallException 常にこの例外をスローします 17 */ 18 public function __call(string $name, array $arguments): void 19 { 20 // BadMethodCallExceptionのインスタンスを生成して、例外をスローします。 21 // ここでコンストラクタ (__construct) が呼び出され、引数が設定されます。 22 throw new BadMethodCallException( 23 // 第1引数 ($message): 例外メッセージ 24 sprintf('メソッド "%s" は存在しません。', $name), 25 // 第2引数 ($code): 任意の例外コード 26 1001 27 ); 28 } 29} 30 31try { 32 // クラスのインスタンスを生成 33 $caller = new DynamicCaller(); 34 35 // 存在しないメソッドを呼び出すことで、__call() メソッドがトリガーされ、 36 // BadMethodCallException がスローされます。 37 $caller->nonExistentMethod('some_argument'); 38 39} catch (BadMethodCallException $e) { 40 // スローされた BadMethodCallException を捕捉します。 41 echo "例外がキャッチされました!" . PHP_EOL; 42 // コンストラクタで設定したメッセージとコードを取得して表示します。 43 echo "メッセージ: " . $e->getMessage() . PHP_EOL; 44 echo "コード: " . $e->getCode() . PHP_EOL; 45 echo "発生場所: " . $e->getFile() . " の " . $e->getLine() . "行目" . PHP_EOL; 46}
BadMethodCallException::__constructは、この例外のインスタンスを生成する際に呼び出されるコンストラクタです。主に、未定義のメソッドが呼び出された場合など、不正なコールバック処理が行われたことを示すために使われます。
コンストラクタは3つの引数を取ります。第1引数の$messageには、エラーの内容を説明する文字列を指定します。サンプルコードではsprintf関数を使い、呼び出されたメソッド名を含む具体的なエラーメッセージを生成しています。第2引数の$codeには、エラーの種類を識別するための任意の整数値を設定できます。これにより、エラーコードに基づいた条件分岐などが可能になります。第3引数の$previousは、この例外が別の例外に起因する場合に、その元の例外オブジェクトを関連付けるために使いますが、省略可能です。コンストラクタのため、戻り値はありません。
サンプルコードでは、存在しないメソッドが呼び出されたときに__callメソッド内でnew BadMethodCallException()が実行され、コンストラクタにメッセージとコードが渡されています。catchブロックでは、getMessage()やgetCode()といったメソッドを使い、コンストラクタで設定した情報を取得して表示しています。
newキーワードで例外クラスのインスタンスを生成すると、コンストラクタ(__construct)が自動的に呼び出されます。コンストラクタの引数で設定したエラーメッセージやコードは、後のcatchブロックでgetMessage()やgetCode()を使って取り出すための重要な情報となります。注意点として、インスタンスを作成しただけでは例外は発生しません。プログラムの実行を中断しエラー処理へ移行させるには、必ずthrowキーワードを使って例外をスローする必要があります。BadMethodCallExceptionは、サンプルコードのように存在しないメソッドが呼び出された場合など、メソッド呼び出しに関するエラーを示す際に使用するのが適切です。状況に応じた例外クラスを選択することが、分かりやすいエラー処理につながります。