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

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

作成日: 更新日:

基本的な使い方

__constructメソッドは、Overrideクラスのインスタンスが作成される際に、そのオブジェクトを初期化するために自動的に実行される特別なメソッドです。このメソッドの主な役割は、新しいオブジェクトが利用できる状態になるように、必要な初期設定を行うことです。具体的には、クラスが持つプロパティに初期値を割り当てたり、オブジェクトが動作するために必要な外部リソース(例えばデータベース接続など)の準備を行ったりします。

開発者は、newキーワードを使ってクラスの新しいインスタンスを生成する際に、__constructメソッドに引数を渡すことができます。これにより、オブジェクトの初期状態を柔軟にカスタマイズし、作成時に必要な情報を設定することが可能になります。例えば、ユーザー情報を扱うオブジェクトであれば、コンストラクタでユーザーIDや名前を渡して初期化することができます。

__constructメソッドは、オブジェクトのライフサイクルにおいて最初に呼び出されるメソッドであり、そのオブジェクトが常に有効で一貫した状態であることを保証するために非常に重要です。このメソッドは、クラスの設計において、オブジェクトの初期化ロジックをカプセル化し、オブジェクトが不正な状態で生成されることを防ぐ役割を果たします。

構文(syntax)

1class Override
2{
3    public function __construct(private string $parameter1, private int $parameter2)
4    {
5    }
6}

引数(parameters)

引数なし

引数はありません

戻り値(return)

戻り値なし

戻り値はありません

サンプルコード

PHP8 コンストラクタプロパティプロモーションでクラスを簡潔にする

1<?php
2
3/**
4 * PHP 8 のコンストラクタプロパティプロモーション(Constructor Property Promotion)を示すクラス。
5 *
6 * この機能により、コンストラクタの引数宣言と同時にプロパティの宣言と初期化を行うことができます。
7 * コードが簡潔になり、クラスの定義がよりすっきりします。
8 */
9class Product
10{
11    /**
12     * Product クラスの新しいインスタンスを生成します。
13     *
14     * @param string $name       商品の名前
15     * @param float  $price      商品の価格
16     * @param bool   $isInStock  商品が在庫にあるかどうか (デフォルトは true)
17     *
18     * コンストラクタ引数の前にアクセス修飾子 (public, protected, private) をつけることで、
19     * その引数が同名のクラスプロパティとして自動的に作成され、初期化されます。
20     * プロパティの型宣言も同時に行われます。
21     */
22    public function __construct(
23        public string $name,       // public プロパティ 'name' が自動的に作成・初期化される
24        public float $price,       // public プロパティ 'price' が自動的に作成・初期化される
25        private bool $isInStock = true // private プロパティ 'isInStock' が自動的に作成・初期化される (デフォルト値あり)
26    ) {
27        // プロパティの初期化がコンストラクタの引数で行われるため、
28        // ここにプロパティ代入のコードを記述する必要はありません。
29        // 必要であれば、追加のバリデーションや複雑な初期化ロジックを記述できます。
30    }
31
32    /**
33     * 商品の現在の在庫状況と価格を含むステータス文字列を返します。
34     *
35     * @return string 商品のステータス情報
36     */
37    public function getStatus(): string
38    {
39        return sprintf(
40            "%sの価格は %.2f円で、在庫は%s。",
41            $this->name,
42            $this->price,
43            $this->isInStock ? 'あります' : 'ありません'
44        );
45    }
46
47    /**
48     * 商品が在庫にあるかどうかを返します。
49     * private プロパティへの外部からのアクセス手段を提供します。
50     *
51     * @return bool 在庫があれば true、なければ false
52     */
53    public function isInStock(): bool
54    {
55        return $this->isInStock;
56    }
57}
58
59// Product クラスのインスタンスを作成します。
60// コンストラクタプロパティプロモーションのおかげで、
61// クラスのプロパティを簡潔に定義し、初期化できます。
62$laptop = new Product('高性能ノートPC', 150000.00);
63$mouse = new Product('ワイヤレスマウス', 3500.00, true);
64$keyboard = new Product('メカニカルキーボード', 12000.00, false);
65
66// 各商品の情報を表示します。
67echo $laptop->getStatus() . PHP_EOL;
68echo $mouse->getStatus() . PHP_EOL;
69echo $keyboard->getStatus() . PHP_EOL;
70
71echo PHP_EOL;
72
73// public プロパティには直接アクセスできます。
74echo "商品名: " . $laptop->name . PHP_EOL;
75echo "価格: " . $laptop->price . PHP_EOL;
76
77// private プロパティには直接アクセスできませんが、
78// ゲッターメソッド(例: isInStock())を通じてアクセスできます。
79echo "ワイヤレスマウスの在庫状況: " . ($mouse->isInStock() ? '在庫あり' : '在庫なし') . PHP_EOL;
80

PHPの__constructメソッドは、クラスから新しいオブジェクト(インスタンス)を作成する際に自動的に呼び出される特別なメソッドです。その主な役割は、オブジェクトが持つプロパティの初期設定を行うことです。

PHP 8では、「コンストラクタプロパティプロモーション」という機能が導入され、クラス定義が簡潔になりました。この機能を使うと、__constructメソッドの引数にpublicprivateなどのアクセス修飾子を付けるだけで、その引数が同名のクラスプロパティとして自動的に宣言され、同時に初期化されます。これにより、プロパティの宣言とコンストラクタ内での代入処理が不要となり、コードを簡潔に保てます。

サンプルコードのProductクラスでは、商品の名前、価格、在庫状況を__constructの引数として受け取り、これらがpublicprivateのプロパティとして自動的に設定されています。__constructメソッドはオブジェクトの初期化を完結させるため、明示的な戻り値は持ちません。この機能は、コードの可読性と保守性を高めることに貢献します。

PHP 8で導入されたコンストラクタプロパティプロモーションは、コンストラクタの引数にアクセス修飾子(public, protected, private)を記述することで、プロパティの宣言と初期化を同時に行うことができる便利な機能です。これにより、クラス定義の記述量を減らし、コードをより簡潔にできます。ただし、PHP 8より前のバージョンではこの機能は動作しませんので注意が必要です。また、privateprotectedをつけたプロパティはクラスの外部から直接アクセスできないため、必要に応じてゲッターメソッドなどのアクセス手段を別途提供する必要があります。この機能は、クラスの初期化ロジックを効率的に記述するために役立ちます。

PHP: parent::__construct で親コンストラクタを呼び出す

1<?php
2
3/**
4 * 親クラスの例
5 *
6 * 親クラスには、そのインスタンスが作成されるときに自動的に実行される
7 * コンストラクタ(__construct)が定義されています。
8 */
9class ParentClass
10{
11    /**
12     * ParentClassのコンストラクタ
13     *
14     * このメソッドは、ParentClassの新しいインスタンスが作成される際に
15     * 自動的に呼び出されます。
16     * 引数はありません。
17     *
18     * @return void
19     */
20    public function __construct()
21    {
22        echo "ParentClass のコンストラクタが実行されました。\n";
23    }
24}
25
26/**
27 * 子クラスの例
28 *
29 * ChildClass は ParentClass を継承しています。
30 * 子クラスで独自のコンストラクタを持つ場合、明示的に親クラスのコンストラクタを
31 * 呼び出す必要があります。
32 */
33class ChildClass extends ParentClass
34{
35    /**
36     * ChildClassのコンストラクタ
37     *
38     * 子クラスのインスタンスが作成される際に呼び出されます。
39     * 引数はありません。
40     *
41     * @return void
42     */
43    public function __construct()
44    {
45        // キーワード: parent
46        // 親クラス(ParentClass)のコンストラクタを呼び出します。
47        // これがないと、ParentClassのコンストラクタは実行されません。
48        parent::__construct();
49
50        echo "ChildClass のコンストラクタが実行されました。\n";
51    }
52}
53
54// ChildClass の新しいインスタンスを作成します。
55// これにより、ChildClass のコンストラクタが実行され、
56// その中で `parent::__construct()` が呼び出されるため、
57// まず ParentClass のコンストラクタ、次に ChildClass のコンストラクタの順で出力されます。
58$childInstance = new ChildClass();
59
60?>

PHPの__constructメソッドは、クラスの新しいインスタンスが作成される際に自動的に実行される特別なメソッドです。これはオブジェクトの初期化処理に用いられ、引数なし、戻り値なし(void)のメソッドです。

サンプルコードでは、ParentClassChildClassにそれぞれ__constructが定義されています。ChildClassParentClassを継承していますが、子クラスで独自のコンストラクタを定義した場合、親クラスのコンストラクタは実行されません。

親クラスの初期化も行いたい場合、子クラスのコンストラクタ内でparent::__construct()を呼び出す必要があります。これは、子クラスから親クラスのコンストラクタを明示的に実行する記述です。

このサンプルコードを実行すると、ChildClassのインスタンス作成時に、まずChildClassのコンストラクタが実行されます。その中でparent::__construct()が呼び出されるため、「ParentClass のコンストラクタが実行されました。」と表示された後、「ChildClass のコンストラクタが実行されました。」という順序でメッセージが出力されます。これにより、継承関係にあるクラス間で初期化処理を適切に連携できます。

__constructメソッドは、クラスのインスタンスが作成される際に自動的に実行される特別な初期化メソッドです。子クラスで独自の__constructメソッドを定義した場合、親クラスの__constructは自動的には呼び出されません。親クラスの初期化処理を確実に実行するには、子クラスの__construct内でparent::__construct();と明示的に呼び出す必要があります。この呼び出しを忘れると、親クラスで設定された初期値や重要な処理がスキップされ、プログラムが正しく動作しない原因となるため、特に注意が必要です。通常、parent::__construct();は子クラスのコンストラクタの最初に記述し、親の初期化を先に行うようにします。