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

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

作成日: 更新日:

基本的な使い方

currentメソッドは、ジェネレータが現在一時停止している位置で生成された値を取得するメソッドです。PHPのジェネレータは、yieldキーワードを使用して値を一時的に生成し、処理を一時停止させることで、メモリを効率的に利用しながら繰り返し処理を行うための機能を提供します。このcurrentメソッドは、ジェネレータがyield式を通じて生成した現在の値を参照するために用いられます。

ジェネレータ関数が呼び出され、最初のyield式が実行されて値が生成された後、またはnext()メソッドによって次の値へと進んだ後にcurrent()メソッドを呼び出すことで、その時点での最新の生成値を取得することができます。例えば、ジェネレータがyield 20という式で値を生成した場合、current()は整数20を返します。

しかし、ジェネレータがまだ一度も値を生成していない状態や、すべての値の生成が完了しジェネレータが既に終了している場合には、current()メソッドはnullを返します。このメソッドは、ジェネレータオブジェクトの内部状態を把握し、現在どの値に注目しているかを確認する際に役立ちます。

構文(syntax)

1<?php
2
3function myGenerator() {
4    yield 'Hello';
5    yield 'World';
6}
7
8$generator = myGenerator();
9echo $generator->current();
10

引数(parameters)

引数なし

引数はありません

戻り値(return)

mixed

現在のイテレータ位置にある値を返します。イテレータが空の場合は null が返されます。

サンプルコード

PHP Generator::currentで月の日付を取得する

1<?php
2
3/**
4 * 指定された年月の最終日を返す関数。
5 *
6 * @param int $year 年。
7 * @param int $month 月。
8 * @return int 指定された年月の最終日。
9 */
10function getLastDayOfMonth(int $year, int $month): int
11{
12    return (int)date('t', mktime(0, 0, 0, $month, 1, $year));
13}
14
15/**
16 * 指定された年月の日付を生成する Generator 関数。
17 *
18 * @param int $year 年。
19 * @param int $month 月。
20 * @return Generator 日付を順番に返す Generator。
21 */
22function generateDatesOfMonth(int $year, int $month): Generator
23{
24    $lastDay = getLastDayOfMonth($year, $month);
25
26    for ($day = 1; $day <= $lastDay; $day++) {
27        yield new DateTimeImmutable("$year-$month-$day");
28    }
29}
30
31// 使用例:2024年1月の日付を順番に表示する
32$year = 2024;
33$month = 1;
34
35$dateGenerator = generateDatesOfMonth($year, $month);
36
37foreach ($dateGenerator as $date) {
38    echo $date->format('Y-m-d') . PHP_EOL;
39}
40
41// current() メソッドの使用例 (foreach ループ内で暗黙的に使われるため、ここでは直接的な使用例を示す)
42$dateGenerator->rewind(); // ジェネレータを初期位置に戻す
43$firstDate = $dateGenerator->current();
44if ($firstDate instanceof DateTimeImmutable) {
45  echo "最初の日: " . $firstDate->format('Y-m-d') . PHP_EOL;
46} else {
47  echo "ジェネレータが空です。" . PHP_EOL;
48}
49

PHP 8のGeneratorクラスにおけるcurrentメソッドについて解説します。currentメソッドは、ジェネレータが現在指している値を返します。ジェネレータは、yieldキーワードを使って値を順番に生成する特別な関数です。

サンプルコードでは、指定された年月の全ての日付をDateTimeImmutableオブジェクトとして生成するgenerateDatesOfMonth関数を定義しています。この関数は、yieldを使って日付を一つずつ返します。

ジェネレータから値を取り出すには、通常foreachループを使用します。foreachループは、内部で自動的にジェネレータのcurrentメソッドを呼び出し、現在の値を処理します。

サンプルコードの後半部分では、currentメソッドを直接使用する例を示しています。まず、rewindメソッドでジェネレータを初期位置に戻しています。これは、ジェネレータが既に最後まで進んでいる場合に、最初の要素から再度アクセスできるようにするためです。その後、$dateGenerator->current()を呼び出すことで、ジェネレータが指す最初のDateTimeImmutableオブジェクトを取得し、フォーマットして表示しています。

currentメソッドは引数を取りません。戻り値はmixed型であり、ジェネレータが現在指している値を返します。ジェネレータが空の場合や、rewindnextで終端を超えた場合にはNULLを返します。currentメソッドを使用することで、ジェネレータの現在の状態を直接的に確認することができます。foreach文で暗黙的に使用されることが多いですが、ジェネレータの状態を細かく制御したい場合に役立ちます。

Generatorクラスのcurrent()メソッドは、ジェネレータが現在指している値を返します。foreachループでは自動的に呼び出されるため、意識することは少ないかもしれません。ジェネレータは一度値をyieldすると、その位置を保持します。そのため、再度同じ値を参照するには、rewind()でジェネレータを初期位置に戻す必要があります。current()を呼び出す前にrewind()を忘れると、意図しない値が返ってくる可能性があります。また、ジェネレータが空の場合、current()NULLを返すことがあります。そのため、返り値が期待する型(この例ではDateTimeImmutable)であるかを確認することが重要です。型チェックを怠ると、後続の処理でエラーが発生する可能性があります。

PHP Generator::current() で値を取得する

1<?php
2
3/**
4 * Generator::current() の使用例
5 */
6
7function numberGenerator(int $start, int $end): Generator
8{
9  for ($i = $start; $i <= $end; $i++) {
10    yield $i;
11  }
12}
13
14$generator = numberGenerator(1, 3);
15
16// ジェネレータの現在の値を表示する
17echo $generator->current() . PHP_EOL; // 出力: 1
18
19$generator->next();
20
21// ジェネレータの次の値を表示する
22echo $generator->current() . PHP_EOL; // 出力: 2
23
24$generator->next();
25
26// ジェネレータの次の値を表示する
27echo $generator->current() . PHP_EOL; // 出力: 3
28
29$generator->next();
30
31// ジェネレータが完了した場合、current() は値を返さない
32var_dump($generator->current()); // 出力: bool(false)

PHP 8における Generator クラスの current() メソッドは、ジェネレータが現在指している値を返します。引数は必要ありません。戻り値は、ジェネレータが生成する値の型に応じて mixed 型となります。

このサンプルコードでは、numberGenerator というジェネレータ関数を定義しています。この関数は、指定された開始値から終了値までの数値を順番に生成します。

$generator = numberGenerator(1, 3); でジェネレータオブジェクトを作成し、$generator->current() を呼び出すことで、ジェネレータが最初に指している値(この場合は 1)を取得して表示しています。

$generator->next(); を呼び出すことで、ジェネレータの内部ポインタを次の値に進めます。その後、再度 $generator->current() を呼び出すと、次の値(この場合は 2、3)が表示されます。

ジェネレータがすべての値を生成し終えた後、つまり next() を呼び出してジェネレータが完了状態になった場合、current()false を返します。var_dump($generator->current()); の出力結果から、この挙動を確認できます。

current() メソッドは、ジェネレータが現在どの値を生成しているかを確認する際に使用します。ジェネレータの内部ポインタを進める next() メソッドと組み合わせて使用することで、順番に値を処理できます。

Generator::current()は、ジェネレータが現在指している値を返します。ジェネレータを最初に作成した直後は、next()を一度も呼ばれていないため、最初のyieldの値が返されます。next()を呼ぶごとに、ジェネレータの内部ポインタが進み、current()は次の値を返すようになります。ジェネレータが最後まで到達し、それ以上yieldする値がない場合、current()falseを返します。このfalseはジェネレータが完了したことを示すため、値がfalseになる可能性も考慮した上で利用する必要があります。current()を呼ぶ前にnext()を呼ぶ必要がある点に注意してください。