【PHP8.x】CallbackFilterIterator::valid()メソッドの使い方
validメソッドの使い方について、初心者にもわかりやすく解説します。
基本的な使い方
『validメソッドは、イテレータの現在の位置が有効な要素を指しているかどうかをチェックするメソッドです』
このメソッドは、CallbackFilterIteratorが内部で保持しているイテレータを走査する際に、フィルタリング条件を満たす次の有効な要素が存在するかどうかを確認するために使用されます。validが呼び出されると、まず内部イテレータの現在の要素が有効かどうかが確認されます。もし無効であれば、つまりイテレータの終端に達していれば、validはfalseを返します。内部イテレータの要素が有効な場合、次にコンストラクタで指定されたコールバック関数がその要素を引数として実行されます。コールバック関数がtrueを返した場合、その要素はフィルタリング条件を満たしていると見なされ、validメソッドはtrueを返して処理を終了します。もしコールバック関数がfalseを返した場合、CallbackFilterIteratorは内部イテレータを次の要素へ進め、再び同じチェックを繰り返します。この処理は、条件を満たす要素が見つかるか、イテレータの終端に達するまで続けられます。この仕組みにより、foreachなどのループ構文でCallbackFilterIteratorを扱う際に、フィルタリング条件に合致する要素だけを効率的に取り出すことが可能になります。
構文(syntax)
1<?php 2 3$dataSource = new ArrayIterator(['apple', 'banana', 'orange', 'apricot']); 4 5$filter = function (string $current): bool { 6 // 'a'で始まる要素だけを有効とする 7 return str_starts_with($current, 'a'); 8}; 9 10$iterator = new CallbackFilterIterator($dataSource, $filter); 11 12// イテレータを先頭に戻す 13$iterator->rewind(); 14 15// valid() が true を返す間、ループを続ける 16while ($iterator->valid()) { 17 echo $iterator->current() . PHP_EOL; 18 $iterator->next(); 19}
引数(parameters)
引数なし
引数はありません
戻り値(return)
bool
このメソッドは、現在のイテレータ位置が有効な要素を指しているかどうかを示す真偽値(bool)を返します。有効な場合は true、無効な場合は false が返されます。
サンプルコード
PHP CallbackFilterIteratorでバリデーションする
1<?php 2 3declare(strict_types=1); 4 5/** 6 * CallbackFilterIterator を使用して、配列から特定の条件(バリデーション)を満たす要素のみを抽出します。 7 * 8 * このクラスは、イテレータの各要素に対してコールバック関数(検証ロジック)を適用し、 9 * true を返した要素のみを通過させます。 10 * 11 * valid() メソッドは、ループ処理中にイテレータの現在の位置が有効かどうか(要素が存在するかどうか)を 12 * 確認するために使われます。 13 */ 14class NumberValidator 15{ 16 /** 17 * 10より大きい数値のみをフィルタリングして表示します。 18 * 19 * @param int[] $numbers 検証対象の数値配列 20 */ 21 public function displayValidNumbers(array $numbers): void 22 { 23 // 元の配列からイテレータを作成します。 24 $arrayIterator = new ArrayIterator($numbers); 25 26 // フィルタリング(検証)ルールをコールバック関数として定義します。 27 // この例では、「数値が10より大きいこと」を検証ルールとします。 28 $validationCallback = function (int $currentValue): bool { 29 return $currentValue > 10; 30 }; 31 32 // コールバック関数を適用するフィルタ・イテレータを作成します。 33 $filterIterator = new CallbackFilterIterator($arrayIterator, $validationCallback); 34 35 echo "検証ルール (10より大きい) を満たす数値:" . PHP_EOL; 36 37 // foreachループは内部で valid() メソッドを呼び出し、 38 // 有効な要素がなくなるまで処理を続けます。 39 foreach ($filterIterator as $validNumber) { 40 echo $validNumber . PHP_EOL; 41 } 42 } 43} 44 45// テスト用のデータ 46$sampleData = [5, 12, 8, 25, 10, 15]; 47 48// クラスのインスタンスを作成してメソッドを実行します。 49$validator = new NumberValidator(); 50$validator->displayValidNumbers($sampleData); 51 52/* 53実行結果: 54検証ルール (10より大きい) を満たす数値: 5512 5625 5715 58*/
CallbackFilterIteratorクラスのvalid()メソッドは、イテレータの現在の位置に有効な要素が存在するかどうかを判定するために使われます。このメソッドは主にforeachなどのループ処理の中でPHPによって内部的に呼び出されるため、開発者が直接コードに記述することは稀です。
valid()メソッドは引数を取りません。戻り値は真偽値(bool)で、現在の位置に処理すべき要素が存在する場合はtrueを、これ以上要素がなく反復処理の終わりに達した場合はfalseを返します。このfalseが返されると、foreachループは終了します。
サンプルコードでは、配列の要素を「10より大きい」という条件でフィルタリング(検証)しています。foreachループがこのフィルタリング済みイテレータを処理する際、内部でvalid()メソッドが繰り返し呼び出されます。条件に合う有効な要素(12, 25, 15)が見つかる間はtrueを返し続け、全ての有効な要素を処理し終えるとfalseを返してループを停止させます。このようにvalid()は、ループがいつ終わるべきかを判断する重要な役割を担っています。
このコードのポイントは、検証ルールを定義したコールバック関数です。この関数がtrueを返した要素だけが、イテレータの結果として残ります。foreachループは、内部で自動的にvalid()メソッドを呼び出し、処理できる要素がまだ存在するかを確認しながら動作します。開発者がvalid()を直接記述することは通常ありません。また、CallbackFilterIteratorは元の配列を直接変更せず、フィルタリングされた結果を提供するだけなので、元のデータは安全に保たれます。コード冒頭のdeclare(strict_types=1);は、PHPに厳密な型チェックを強制する宣言で、意図しない型のデータが渡された際にエラーを発生させ、コードの安定性を高める重要な役割を果たします。
CallbackFilterIteratorでPHPを検証する
1<?php 2 3/** 4 * CallbackFilterIteratorを使用して配列を検証(フィルタリング)するサンプルクラスです。 5 * 6 * この例では、数値の配列から「10より大きい偶数」という条件に合致する 7 * 有効な(valid)要素だけを抽出します。 8 */ 9class NumberValidator 10{ 11 /** 12 * 条件に合致する有効な数値を抽出し、表示します。 13 */ 14 public static function run(): void 15 { 16 // 1. 元となるデータ配列 17 $numbers = [5, 12, 3, 18, 7, 25, 30, 15]; 18 19 // 2. データをイテレータに変換 20 $iterator = new ArrayIterator($numbers); 21 22 // 3. 検証(フィルタリング)のためのコールバック関数を定義 23 // この関数が true を返す要素のみが有効と見なされます。 24 $validatorCallback = function (int $currentValue, int $key, Iterator $iterator): bool { 25 // 条件: 10より大きく、かつ偶数であること 26 return $currentValue > 10 && $currentValue % 2 === 0; 27 }; 28 29 // 4. CallbackFilterIteratorのインスタンスを生成 30 // 第1引数に元のイテレータ、第2引数に検証用コールバック関数を渡します。 31 $filterIterator = new CallbackFilterIterator($iterator, $validatorCallback); 32 33 echo "検証ルール(10より大きい偶数)に合致した有効な値:\n"; 34 35 // 5. foreachループは内部でvalid()メソッドを呼び出しています。 36 // ループを続けるかどうかをvalid()の戻り値(true/false)で判断します。 37 foreach ($filterIterator as $key => $value) { 38 printf("インデックス %d: 値 %d\n", $key, $value); 39 } 40 } 41} 42 43// サンプルコードの実行 44NumberValidator::run();
CallbackFilterIteratorクラスのvalidメソッドは、イテレータの現在の要素が有効かどうかを判定する役割を担います。このメソッドは引数を取らず、戻り値としてtrueまたはfalseのbool値を返します。
CallbackFilterIteratorは、コンストラクタで指定された検証用の「コールバック関数」を用いて、元のデータ(イテレータ)をフィルタリングします。validメソッドは、内部でこのコールバック関数を現在の要素に対して実行します。
サンプルコードでは、「10より大きい偶数であること」を判定するコールバック関数が定義されています。foreachループでCallbackFilterIteratorを処理すると、ループの各ステップでvalidメソッドが自動的に呼び出されます。そして、validメソッドはコールバック関数を実行し、その結果を返します。
コールバック関数がtrueを返した要素(サンプルでは12, 18, 30)の場合、validメソッドもtrueを返し、その要素は有効なデータとしてループ内で処理されます。逆に、コールバック関数がfalseを返した要素は無効と見なされ、validメソッドもfalseを返すため、ループでスキップされます。このようにvalidメソッドは、フィルタリングの条件を満たす要素だけを通過させる重要な役割を果たします。
このコードの検証ロジックは、CallbackFilterIteratorに渡すコールバック関数が中心です。この関数がbool型のtrueを返した要素のみが、foreachループで処理対象となります。foreachは内部でvalid()メソッドを呼び出し、処理すべき有効な要素が残っているかを確認します。コールバック関数でtrueになる要素が一つもなければ、ループは実行されません。コールバックの引数に型を指定すると、予期せぬデータに対する安全性が向上します。この仕組みは配列だけでなく、イテレータに対応した様々なデータソースに応用可能です。