【PHP8.x】__constructメソッドの使い方

__constructメソッドの使い方について、初心者にもわかりやすく解説します。

作成日: 更新日:

基本的な使い方

『__constructメソッドは、CompileErrorオブジェクトの新しいインスタンスを生成し、初期化を実行するメソッドです。CompileErrorは、PHPコードが実行される前のコンパイル段階で発生するエラーを表すためのクラスです。このコンストラクタは、エラーメッセージ、エラーコード、そして前の例外オブジェクトを引数として受け取ることができ、それらの情報を基に新しいCompileErrorインスタンスを構築します。通常、このメソッドはプログラマが直接コード内で呼び出すものではなく、PHPエンジンが内部的に使用します。PHPエンジンは、コンパイルの過程でエラーを検出した際に、このコンストラクタを呼び出してCompileErrorオブジェクトを生成し、それをスローします。開発者は、try...catchブロックを用いてこのスローされたCompileErrorオブジェクトを捕捉することで、従来はスクリプトの実行を停止させていたコンパイル時のエラーをプログラムで制御し、適切に処理することが可能になります。

構文(syntax)

1new CompileError(?string $message = "", int $code = 0, ?Throwable $previous = null)

引数(parameters)

string $message = "", int $code = 0, ?Throwable $previous = null

  • string $message = "": 例外のメッセージを指定する文字列です。
  • int $code = 0: 例外のエラーコードを指定する整数です。
  • ?Throwable $previous = null: この例外の前に発生した例外を指定します。

戻り値(return)

戻り値なし

戻り値はありません

サンプルコード

PHP8 コンストラクタプロパティプロモーションでカスタムエラーを生成する

1<?php
2
3/**
4 * PHP 8で導入されたコンストラクタプロパティプロモーションの例です。
5 * これは、コンストラクタの引数を直接クラスのプロパティとして定義する簡潔な方法です。
6 * CompileErrorの__constructメソッドの引数シグネチャ (メッセージ、コード、前の例外) に
7 * 合わせたカスタムエラークラスを想定しています。
8 *
9 * このクラスは、`CompileError`自体がPHPの内部クラスであり、ユーザーコードから直接
10 * プロパティプロモーションを適用できないため、その引数構成を模倣したカスタムの
11 * Exceptionクラスとして定義されています。
12 */
13class MyCustomError extends Exception
14{
15    /**
16     * コンストラクタプロパティプロモーションを使用し、引数を同時にプロパティとして宣言します。
17     * PHP 8以降では、このようにpublic, protected, private修飾子を付けて
18     * コンストラクタ引数を宣言すると、自動的に同名のプロパティが定義され、
19     * 引数の値で初期化されます。
20     *
21     * @param string $message エラーメッセージ。デフォルトは空文字列。
22     * @param int $code エラーコード。デフォルトは0。
23     * @param Throwable|null $previous 前の例外オブジェクト。デフォルトはnull。
24     */
25    public function __construct(
26        public string $message = "",
27        public int $code = 0,
28        public ?Throwable $previous = null
29    ) {
30        // 親クラスであるExceptionのコンストラクタを呼び出し、
31        // エラーメッセージとコード、前の例外を設定します。
32        // ここでは、プロパティプロモーションによって自動的に作成された $this->message,
33        // $this->code, $this->previous を利用します。
34        parent::__construct($this->message, $this->code, $this->previous);
35    }
36
37    /**
38     * このカスタムエラーインスタンスの詳細情報を文字列として返します。
39     *
40     * @return string エラー情報の整形された文字列。
41     */
42    public function getErrorInfo(): string
43    {
44        $info = "エラータイプ: MyCustomError\n";
45        $info .= "メッセージ: {$this->message}\n";
46        $info .= "コード: {$this->code}\n";
47        if ($this->previous) {
48            $info .= "原因: " . $this->previous->getMessage() . " (コード: " . $this->previous->getCode() . ")\n";
49        }
50        return $info;
51    }
52}
53
54// --- サンプルコードの実行例 ---
55try {
56    // 1. メッセージのみを指定してMyCustomErrorを生成
57    $error1 = new MyCustomError("データ処理中に予期せぬエラーが発生しました。");
58    echo $error1->getErrorInfo();
59    // Exceptionクラスのプロパティにもアクセスできることを確認
60    echo "Exception::getMessage()から: " . $error1->getMessage() . "\n";
61    echo "Exception::getCode()から: " . $error1->getCode() . "\n\n";
62
63    // 2. コードと前の例外を指定してMyCustomErrorを生成
64    $previousRuntimeException = new RuntimeException("データベース接続に失敗しました。", 1001);
65    $error2 = new MyCustomError(
66        "システム連携処理が中断されました。",
67        5002,
68        $previousRuntimeException
69    );
70    echo $error2->getErrorInfo();
71    echo "Exception::getMessage()から: " . $error2->getMessage() . "\n";
72    echo "Exception::getCode()から: " . $error2->getCode() . "\n\n";
73
74    // 3. 実際にカスタムエラーをスローしてキャッチする例
75    echo "--- MyCustomErrorをスローします ---\n";
76    throw new MyCustomError("重要なサービスが利用できません。", 3003);
77
78} catch (MyCustomError $e) {
79    echo "--- MyCustomError をキャッチしました ---\n";
80    echo $e->getErrorInfo();
81    echo "例外が発生したファイル: " . $e->getFile() . "\n";
82    echo "例外が発生した行: " . $e->getLine() . "\n";
83} catch (Throwable $e) {
84    // MyCustomError以外の予期せぬエラーをキャッチする場合
85    echo "--- 予期せぬエラーをキャッチしました ---\n";
86    echo "メッセージ: " . $e->getMessage() . "\n";
87}
88
89?>

このサンプルコードは、PHP 8で導入された「コンストラクタプロパティプロモーション」という機能を用いて、独自の例外クラスMyCustomErrorを定義する例です。__constructメソッドは、クラスのインスタンスが生成される際に自動的に呼び出されるコンストラクタで、特定の戻り値は返しません。

このクラスのコンストラクタは、コンパイルエラーを表すCompileErrorクラスの引数構成を参考に、エラーメッセージの文字列$message、エラーコードの整数$code、そして原因となった前の例外$previousを受け取ります。

コンストラクタプロパティプロモーションを利用することで、引数の前にpublicのような可視性修飾子を付けるだけで、同名のプロパティが自動的に宣言され、渡された値で初期化されます。これにより、従来必要だったプロパティの宣言とコンストラクタ内での代入処理を省略でき、コードを簡潔に記述できます。

コンストラクタの内部ではparent::__construct()を呼び出し、親クラスであるExceptionが持つ機能を使えるように初期設定を行っています。実行例では、このカスタムエラーを生成したり、throwキーワードで意図的に発生させ、try-catch構文で捕捉する基本的な例外処理の流れを示しています。

このコードはPHP 8で導入されたコンストラクタプロパティプロモーションの利用例です。publicなどのアクセス修飾子を付けて引数を定義すると、自動で同名のプロパティが宣言・初期化され、クラス定義を簡潔に記述できます。

CompileErrorはPHP内部クラスのためユーザーコードから直接継承やインスタンス化はできませんが、このサンプルはその引数構成を模倣したカスタム例外の作成方法を示しています。カスタム例外を作成する際は、親クラスExceptionのコンストラクタを必ず呼び出し、標準的なエラー処理機能を適切に活用してください。引数の型宣言とデフォルト値の活用で、コードの堅牢性と柔軟性が高まります。

PHP construct parentで親クラスを呼び出す

1<?php
2
3// PHPの内部クラスである CompileError は、PHPエンジンによって使用されるため、
4// ユーザーコードから直接インスタンス化することはできません。
5// しかし、そのコンストラクタのシグネチャと、PHPの Error クラスを継承していることを考慮し、
6// ここでは、同様に Error クラスを継承し、`parent::__construct` を利用する
7// カスタムエラークラスの例を示します。
8// これにより、「php construct parent」の概念を、システムエンジニアを目指す初心者にも
9// 理解しやすく説明することを目的としています。
10
11/**
12 * CustomError クラスは、PHPの組み込み Error クラスを拡張します。
13 * CompileError も Error を継承しているため、この構造は類似しています。
14 * このクラスは、コンストラクタで親クラスの初期化を行う方法を示します。
15 */
16class CustomError extends Error
17{
18    /**
19     * CustomError のコンストラクタです。
20     *
21     * 新しい CustomError オブジェクトが作成されるときに自動的に呼び出されます。
22     * CompileError のコンストラクタと同様に、エラーメッセージ、コード、
23     * および以前の Throwable オブジェクトを受け入れます。
24     *
25     * @param string $message エラーメッセージ。デフォルトは空文字列です。
26     * @param int $code エラーコード。デフォルトは 0 です。
27     * @param ?Throwable $previous このエラーがスローされる原因となった以前の Throwable オブジェクト。
28     *                             エラーの連鎖を表現するために使用されます。
29     */
30    public function __construct(string $message = "", int $code = 0, ?Throwable $previous = null)
31    {
32        // parent::__construct() を呼び出すことで、
33        // 親クラスである Error のコンストラクタが実行され、
34        // 渡されたメッセージ、コード、以前の Throwable が Error クラスに設定されます。
35        // これが、継承クラスで親クラスの初期化を行う「php construct parent」の典型的な使い方です。
36        parent::__construct($message, $code, $previous);
37
38        // 必要であれば、ここに CustomError クラス固有の追加の初期化処理を記述できます。
39        // (CompileError 自体は通常、この部分にユーザーコードレベルの追加初期化を行いません。)
40    }
41}
42
43// --- 以下は CustomError クラスの使用例です。単体で動作可能なことを示します。 ---
44
45// 1. 基本的な CustomError のインスタンス化とスロー
46try {
47    throw new CustomError("設定ファイルの読み込みに失敗しました。", 100);
48} catch (CustomError $e) {
49    echo "捕捉されたエラー: " . $e->getMessage() . " (コード: " . $e->getCode() . ")\n";
50}
51
52// 2. 以前の例外 (Previous Throwable) を伴う CustomError のインスタンス化とスロー
53try {
54    // 何らかの理由で発生した元の例外(例: データベース接続失敗)
55    $originalException = new \RuntimeException("データベースへの書き込み中に問題が発生しました。", 200);
56    // その例外を原因として、より具体的な CustomError をスローします。
57    // 第3引数に $originalException を渡すことで、エラーの連鎖を追跡できます。
58    throw new CustomError("データ保存処理に失敗しました。", 101, $originalException);
59} catch (CustomError $e) {
60    echo "\n捕捉されたエラー: " . $e->getMessage() . " (コード: " . $e->getCode() . ")\n";
61    if ($e->getPrevious() !== null) {
62        echo "原因となった例外: " . $e->getPrevious()->getMessage() . " (コード: " . $e->getPrevious()->getCode() . ")\n";
63    }
64}

PHPのCompileErrorクラスの__constructメソッドは、PHPエンジン内部で利用されるため、ユーザーコードから直接インスタンス化することはできません。しかし、このコンストラクタのシグネチャと、PHPの基盤となるErrorクラスを継承しているという点を踏まえ、ここでは同様にErrorを継承するカスタムエラークラスCustomErrorの例を通じて、その概念を説明します。

CustomErrorクラスの__constructメソッドは、新しいCustomErrorオブジェクトが作成される際に自動的に呼び出される初期化のための特殊なメソッドです。このメソッドは、エラーの詳細を伝えるための$message(文字列、デフォルトは空)、エラーの種類を識別する$code(整数、デフォルトは0)、そしてこのエラーが発生する原因となった以前の例外(Throwableオブジェクト、デフォルトはnull)を受け取ります。これらは、エラーの状況を詳しく伝えるために利用されます。

特に重要なのはparent::__construct($message, $code, $previous);の呼び出しです。これは、継承元である親クラスErrorのコンストラクタを実行し、渡されたエラーメッセージ、コード、以前の例外を親クラスに適切に設定する役割があります。これにより、カスタムエラーがPHPの標準的なエラー処理機構と連携できるようになります。このparent::__constructの利用は、継承したクラスで親クラスの初期化を確実に行うためのPHPの基本的なパターンであり、「php construct parent」という概念を示しています。このコンストラクタは値を返しません。

サンプルコードのCustomErrorは、PHP内部のCompileErrorの構造を参考に作成したカスタムエラークラスです。CompileErrorはPHPエンジン専用であり、ユーザーが直接インスタンス化することは通常できません。継承クラスでコンストラクタを定義する際は、親クラスの初期化を確実に行うため、parent::__construct()を必ず呼び出す必要があります。これにより、エラーメッセージやコードが正しく設定されます。$previous引数を利用すると、複数のエラーが関連し合う「エラーの連鎖」を表現でき、デバッグ時に原因追跡が容易になります。独自のカスタムエラーを作成する際は、ErrorExceptionクラスを継承し、parent::__constructを適切に使うことで、より堅牢なエラーハンドリングを実現できます。

関連コンテンツ