【PHP8.x】FilterIterator::__construct()メソッドの使い方
__constructメソッドの使い方について、初心者にもわかりやすく解説します。
基本的な使い方
『__constructメソッドは、新しいFilterIteratorオブジェクトを生成し、初期化を実行するメソッドです』 このメソッドの主な目的は、フィルタリングの対象となる元のイテレータをオブジェクトに設定することです。コンストラクタは引数を一つだけ取り、その引数にはPHPのIteratorインターフェースを実装した、反復処理が可能なオブジェクトを指定する必要があります。例えば、ArrayIteratorオブジェクトなどがこれに該当します。渡されたイテレータは、生成されるFilterIteratorインスタンスの内部に保持されます。FilterIteratorクラス、またはそれを継承した具象クラスは、この内部に保持したイテレータの各要素に対して、acceptメソッドで定義されたフィルタリング条件を適用します。このコンストラクタを通じて設定されたイテレータがなければ、フィルタリング処理そのものが行えません。したがって、このメソッドは、カスタムフィルタ処理を行うための基盤となるデータソースを準備する上で不可欠な役割を担います。
構文(syntax)
1public __construct(Iterator $iterator)
引数(parameters)
Iterator $iterator
- Iterator $iterator: フィルタリング処理の基盤となるイテレータオブジェクト
戻り値(return)
戻り値なし
戻り値はありません
サンプルコード
PHP8 コンストラクタ昇格でイテレータをフィルタリングする
1<?php 2 3/** 4 * FilterIteratorを継承し、指定されたプレフィックスで始まる文字列のみを許可する 5 * カスタムフィルタクラスです。 6 */ 7class StartsWithFilterIterator extends FilterIterator 8{ 9 /** 10 * PHP 8.0 の「コンストラクタのプロパティ昇格」機能を使用しています。 11 * コンストラクタの引数に可視性修飾子 (private) をつけることで、 12 * プロパティの宣言とコンストラクタ内での代入 ($this->prefix = $prefix;) を 13 * 同時に行うことができます。 14 * 15 * @param Iterator $iterator フィルタリング対象のイテレータ 16 * @param string $prefix フィルタリング条件となるプレフィックス文字列 17 */ 18 public function __construct( 19 Iterator $iterator, 20 private string $prefix 21 ) { 22 // 親クラスである FilterIterator のコンストラクタを呼び出します。 23 parent::__construct($iterator); 24 } 25 26 /** 27 * フィルタリングの条件を定義するメソッドです。 28 * 現在の要素が条件を満たす場合に true を返す必要があります。 29 * 30 * @return bool 31 */ 32 public function accept(): bool 33 { 34 // 現在のイテレータの要素を取得します。 35 $currentValue = $this->current(); 36 37 // PHP 8.0 の新関数 str_starts_with() を使い、 38 // 要素が指定されたプレフィックスで始まるかどうかを判定します。 39 return str_starts_with($currentValue, $this->prefix); 40 } 41} 42 43// フィルタリングの元となるデータ配列 44$data = [ 45 'Apple', 46 'Banana', 47 'Avocado', 48 'Cherry', 49 'Apricot', 50]; 51 52// 配列をイテレータオブジェクトに変換します。 53$iterator = new ArrayIterator($data); 54 55// カスタムフィルタのインスタンスを生成します。 56// ここでは 'A' で始まる要素のみを抽出するように設定します。 57$filter = new StartsWithFilterIterator($iterator, 'A'); 58 59// フィルタリングされた結果をループ処理して出力します。 60foreach ($filter as $item) { 61 echo $item . PHP_EOL; 62}
FilterIteratorクラスのコンストラクタ__constructは、新しいフィルタ用イテレータのインスタンスを生成する際に呼び出されます。このメソッドは、フィルタリングの対象となるIteratorオブジェクトを引数$iteratorとして受け取ります。コンストラクタはオブジェクトを初期化する役割を持つため、特定の値を返す戻り値はありません。
サンプルコードでは、FilterIteratorを継承して独自のStartsWithFilterIteratorクラスを作成しています。このクラスのコンストラクタは、2つの引数を受け取ります。1つ目の$iteratorは、parent::__construct($iterator)という形で親クラスのコンストラクタに渡されます。これにより、FilterIteratorの基本機能であるイテレータの操作が可能になります。
2つ目の引数private string $prefixでは、PHP 8の新機能である「コンストラクタのプロパティ昇格」が使われています。引数にアクセス修飾子(private)を付けるだけで、プロパティの宣言とコンストラクタ内での値の代入を同時に行うことができます。これにより、クラス内にprivate string $prefix;と記述し、コンストラクタ内で$this->prefix = $prefix;と代入する手間が省け、コードが簡潔になります。このように、コンストラクタはオブジェクトが正しく動作するための初期設定を行う重要な役割を担います。
このサンプルコードはPHP 8の新機能「コンストラクタのプロパティ昇格」を利用しています。コンストラクタの引数にprivateを付けることで、プロパティの宣言と値の代入を同時に行えるためコードが簡潔になりますが、PHP 8より前のバージョンでは動作しない点に注意が必要です。FilterIteratorを継承して独自のクラスを作成する際は、必ず親のコンストラクタparent::__construct()を呼び出し、元となるイテレータを渡してください。また、フィルタリングの具体的な条件を定義するaccept()メソッドの実装も必須です。このメソッドは、現在の要素を結果に含める場合にtrueを返すように記述します。FilterIteratorは配列を直接扱えないため、ArrayIteratorなどでイテレータオブジェクトに変換してから利用します。
PHP8 コンストラクタプロパティ昇格でFilterIteratorを拡張する
1<?php 2 3/** 4 * FilterIteratorを継承し、指定した最小値より大きい値のみを通過させるフィルタクラス 5 */ 6class MinimumValueFilter extends FilterIterator 7{ 8 /** 9 * コンストラクタ 10 * 11 * PHP 8.0 の「コンストラクタのプロパティ昇格」機能を利用しています。 12 * 引数に `private int $minimumValue` と記述するだけで、 13 * private な $minimumValue プロパティが宣言され、 14 * コンストラクタの引数で受け取った値が自動的に代入されます。 15 * 16 * @param Iterator $iterator フィルタリング対象のイテレータ 17 * @param int $minimumValue この値より大きい要素のみが通過します 18 */ 19 public function __construct(Iterator $iterator, private int $minimumValue) 20 { 21 // 親クラスである FilterIterator のコンストラクタを呼び出します。 22 parent::__construct($iterator); 23 } 24 25 /** 26 * 現在の要素をフィルタリングに通すかどうかを決定します。 27 * このメソッドが true を返した場合、その要素は有効とみなされます。 28 * 29 * @return bool 現在の要素が $minimumValue より大きい場合に true、そうでない場合に false を返します。 30 */ 31 public function accept(): bool 32 { 33 // 現在のイテレータの値を取得し、コンストラクタで設定した最小値と比較します。 34 return $this->current() > $this->minimumValue; 35 } 36} 37 38// フィルタリング対象のデータを作成します。 39// ArrayIteratorは、配列をイテレータとして扱えるようにするクラスです。 40$numbers = new ArrayIterator([10, 25, 5, 40, 15, 30]); 41 42// 20より大きい値のみをフィルタリングするイテレータのインスタンスを生成します。 43$filter = new MinimumValueFilter($numbers, 20); 44 45echo "20より大きい数値:" . PHP_EOL; 46 47// フィルタリングされた結果をループ処理で出力します。 48foreach ($filter as $value) { 49 echo $value . PHP_EOL; 50}
FilterIteratorは、既存のイテレータに独自のフィルタリング機能を追加するための抽象クラスです。そのコンストラクタである__constructは、フィルタリング対象となるIteratorオブジェクトを引数として受け取り、インスタンスを初期化するために使用されます。このメソッド自体に戻り値はありません。
サンプルコードでは、FilterIteratorを継承して、指定した最小値より大きい数値のみを抽出するMinimumValueFilterクラスを定義しています。このクラスのコンストラクタは、フィルタリング対象のイテレータ$iteratorと、閾値となる$minimumValueを受け取ります。
コンストラクタ内では、まずparent::__construct($iterator)を呼び出し、親クラスにフィルタリング対象のイテレータを渡しています。
また、引数private int $minimumValueは、PHP 8.0の新機能「コンストラクタのプロパティ昇格」を利用した記述です。これにより、privateな$minimumValueプロパティの宣言と、引数で受け取った値の代入を同時に行うことができ、コードがより簡潔になります。
このMinimumValueFilterクラスのインスタンスをforeachで処理すると、acceptメソッドの条件を満たす要素、つまりコンストラクタで指定した値より大きい要素だけが取り出されます。
このサンプルコードで使われているコンストラクタの引数 private int $minimumValue という書き方は、PHP 8.0からの新機能「コンストラクタのプロパティ昇格」です。古いバージョンのPHPでは構文エラーとなるため、実行環境の確認が必要です。FilterIteratorを継承するクラスでは、フィルタの条件を定義するacceptメソッドを必ず実装する必要があります。また、コンストラクタ内で親クラスのコンストラクタparent::__construct()を呼び出すことを忘れないでください。これを省略すると、イテレータが正しく初期化されず、意図しない動作の原因となります。このフィルタは配列を直接受け取れないため、ArrayIteratorなどでイテレータオブジェクトに変換してから渡してください。