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

作成日: 更新日:

__constructメソッドは、InternalIteratorクラスの新しいインスタンスを生成し、初期化を実行するメソッドです。InternalIteratorは、PHPの内部イテレータを扱うための基底クラスであり、具体的なイテレータの実装は、このクラスを拡張して行われます。__constructメソッドは、オブジェクトが生成される際に自動的に呼び出される特殊なメソッドであり、オブジェクトの初期状態を設定するために使用されます。

このメソッドは、通常、イテレータが処理するデータソース(配列、オブジェクト、ファイルなど)への参照を受け取り、そのデータソースを内部的に保持します。これにより、イテレータはデータソースの状態を追跡し、rewindvalidcurrentkeynextなどのイテレータメソッドを通じて、データソースの要素にアクセスできるようになります。

__constructメソッドの具体的な実装は、InternalIteratorクラスを拡張するサブクラスによって異なります。それぞれのサブクラスは、独自のデータソースの構造やアクセス方法に合わせて、__constructメソッドをオーバーライドし、必要な初期化処理を行います。例えば、配列を処理するイテレータであれば、__constructメソッドで配列を受け取り、内部ポインタを配列の先頭に設定するなどの処理を行います。ファイルの内容を処理するイテレータであれば、ファイルハンドルを受け取り、ファイルの読み込み位置を初期化するなどの処理を行います。

システムエンジニアを目指す初心者にとって、__constructメソッドの役割を理解することは、オブジェクト指向プログラミングの基本を理解する上で重要です。オブジェクトの初期化処理を適切に行うことで、オブジェクトが正しく動作し、意図した結果を得ることができます。

基本的な使い方

構文(syntax)

1private __construct()

引数(parameters)

引数なし

引数はありません

戻り値(return)

戻り値なし

戻り値はありません

サンプルコード

PHP InternalIterator__construct で初期化する

1<?php
2
3/**
4 * InternalIterator のコンストラクタのサンプルコード。
5 *
6 * InternalIterator は PHP 8.0 以降で使用できる内部イテレータクラスの基底クラスです。
7 * 直接インスタンス化することはできませんが、その振る舞いを理解するために、
8 * 継承したクラスでコンストラクタを定義する例を示します。
9 */
10class MyIterator extends InternalIterator
11{
12    public function __construct()
13    {
14        // 親クラスのコンストラクタを呼び出す必要がある場合。
15        // parent::__construct();
16
17        // イテレータの初期化処理をここに記述します。
18        echo "MyIterator コンストラクタが呼ばれました。\n";
19    }
20
21    public function current(): mixed
22    {
23        // current() メソッドの実装
24        return null;
25    }
26
27    public function next(): void
28    {
29        // next() メソッドの実装
30    }
31
32    public function key(): mixed
33    {
34        // key() メソッドの実装
35        return null;
36    }
37
38    public function valid(): bool
39    {
40        // valid() メソッドの実装
41        return false;
42    }
43
44    public function rewind(): void
45    {
46        // rewind() メソッドの実装
47    }
48}
49
50// MyIterator のインスタンスを作成
51$myIterator = new MyIterator();
52
53?>

PHP 8 における InternalIterator クラスのコンストラクタ __construct の使用例です。InternalIterator は、PHP 内部で使用されるイテレータの基底クラスであり、直接インスタンス化することは想定されていません。

このサンプルコードでは、InternalIterator を継承した MyIterator クラスを定義し、その中でコンストラクタ __construct を実装しています。__construct は、オブジェクトが生成される際に自動的に呼び出される特別なメソッドです。引数はなく、戻り値もありません。

MyIterator のコンストラクタ内では、イテレータの初期化処理を記述します。例えば、イテレータが扱うデータ構造の準備などを行います。必要に応じて、親クラス (InternalIterator) のコンストラクタを parent::__construct() で呼び出すことも可能です。

サンプルコードでは、コンストラクタが呼び出されたことを示すメッセージを echo で出力しています。また、MyIterator クラスは InternalIterator を継承しているため、current(), next(), key(), valid(), rewind() などの抽象メソッドを実装する必要があります。これらのメソッドは、イテレータの各操作(現在の要素の取得、次の要素への移動、キーの取得、イテレータが有効かどうかの判定、イテレータの先頭への巻き戻し)を定義します。

最後に、MyIterator クラスのインスタンスを作成し、コンストラクタが実行されることを確認しています。この例を通じて、InternalIterator の継承とコンストラクタの役割を理解することができます。

InternalIteratorクラスは直接インスタンス化できません。このサンプルコードでは、InternalIteratorを継承したMyIteratorクラスを作成し、コンストラクタを定義しています。

注意点として、InternalIteratorを継承した場合、必要なcurrent(), next(), key(), valid(), rewind()メソッドを必ず実装する必要があります。これらのメソッドが未実装の場合、エラーが発生します。

また、親クラスであるInternalIteratorのコンストラクタを呼び出す必要はありませんが、継承先のクラスで独自の初期化処理を行うことができます。サンプルコードでは、コンストラクタ内で初期化処理の記述例を示しています。

PHP 8 Property Promotionによるコンストラクタ初期化

1<?php
2
3/**
4 * InternalIterator のコンストラクタのサンプルコード (Property Promotion を使用).
5 */
6class MyIterator implements Iterator
7{
8    private int $position = 0;
9    private array $array = [
10        "first",
11        "second",
12        "third"
13    ];
14
15    public function __construct(
16        // Property Promotion: コンストラクタ引数でプロパティを定義し初期化
17        private string $name = 'default_name',
18        private int $id = 0
19    ) {
20    }
21
22    public function rewind(): void
23    {
24        $this->position = 0;
25    }
26
27    public function current(): mixed
28    {
29        return $this->array[$this->position];
30    }
31
32    public function key(): mixed
33    {
34        return $this->position;
35    }
36
37    public function next(): void
38    {
39        ++$this->position;
40    }
41
42    public function valid(): bool
43    {
44        return isset($this->array[$this->position]);
45    }
46
47    public function getName(): string
48    {
49        return $this->name;
50    }
51
52    public function getId(): int
53    {
54        return $this->id;
55    }
56}
57
58// MyIterator のインスタンスを生成
59$myIterator = new MyIterator('MyIterator instance', 123);
60
61// イテレータを使用
62foreach ($myIterator as $key => $value) {
63    echo "Key: $key, Value: $value\n";
64}
65
66// Property Promotion で定義されたプロパティにアクセス
67echo "Name: " . $myIterator->getName() . "\n";
68echo "ID: " . $myIterator->getId() . "\n";

このサンプルコードは、PHP 8 の InternalIterator を実装したクラス MyIterator のコンストラクタ (__construct) の使用例を示しています。InternalIterator は、Iterator インターフェースを実装するために内部的に使用されるクラスですが、ここでは例として Iterator インターフェースを直接実装した MyIterator クラスを作成しています。

コンストラクタの特徴的な点として、PHP 8 で導入された Property Promotion を利用していることが挙げられます。Property Promotion を使うと、コンストラクタの引数でクラスのプロパティを定義し、同時に初期化できます。これにより、private string $name = 'default_name'private int $id = 0 のように、引数の定義と同時にプロパティの定義と初期化が一度に行えます。

この例では、$name$id という2つのプロパティをコンストラクタで定義し、それぞれデフォルト値を設定しています。MyIterator クラスのインスタンス生成時に引数を渡すことで、これらのプロパティの値を上書きできます。

サンプルコードでは、MyIterator のインスタンスを生成し、foreach ループを使ってイテレータとして使用しています。また、Property Promotion で定義されたプロパティにアクセスするために、getName() メソッドと getId() メソッドを使用し、それぞれの値を出力しています。Property Promotion を利用することで、コードをより簡潔に記述できます。

このサンプルコードは、PHP 8のコンストラクタプロパティプロモーションを使用しています。コンストラクタの引数で private string $name = 'default_name' のように、アクセス修飾子(private)と型(string)を指定することで、クラスのプロパティ定義と初期化を同時に行えます。

注意点として、プロパティプロモーションを使用すると、コンストラクタの引数リストが長くなる可能性があります。また、アクセス修飾子を省略すると、publicプロパティとして扱われます。プロパティの意図するアクセス範囲に合わせて、適切にアクセス修飾子を指定してください。

InternalIterator はPHP内部クラスなので、直接インスタンス化するのではなく、Iterator インターフェースを実装した独自のクラスを作成し、InternalIterator のメソッドを参考に実装する必要があります。このサンプルコードでは、MyIteratorクラスがIterator インターフェースを実装しています。

【PHP8.x】__constructメソッドの使い方 | いっしー@Webエンジニア