ジェネレータ
PHP Manual

Generator オブジェクト

ジェネレータ関数を最初に呼んだときに、 Generator クラスのオブジェクトが返されます。 このオブジェクトは Iterator インターフェイスを実装しており、前進しかできないイテレータとほぼ同じようになっています。

Generator クラスのメソッドのほとんどは Iterator インターフェイスのメソッドと同じ構文です。 しかし Generator オブジェクトには、もうひとつ send() メソッドが追加されています。

警告

Generator オブジェクトのインスタンスを new で作ることはできません。

例1 Generator クラス

<?php
class Generator implements Iterator {
    public function 
rewind();          // イテレータを巻き戻します。
                                       // すでに反復処理が始まっている場合は
                                       // 例外をスローします。

    
public function valid();           // イテレータが閉じた後は
                                       // false を返し、それ以外の場合は
                                       // true を返します。

    
public function current();         // yield した値を返します。

    
public function key();             // yield したキーを返します。

    
public function next();            // ジェネレータの実行を続けます。

    
public function send($value);      // 指定した値を
                                       // yield の結果としてジェネレータに送信し、
                                       // ジェネレータの実行を続けます。
}
?>

Generator::send()

Generator::send() は、 値をジェネレータ関数に注入して反復処理を進めます。 注入された値を返すには yield 文を使います。 これを、ジェネレータ関数の中で他の変数と同じように使えます。

例2 Generator::send() による値の注入

<?php
function printer() {
    while (
true) {
        
$string yield;
        echo 
$string;
    }
}

$printer printer();
$printer->send('Hello world!');
?>

上の例の出力は以下となります。

Hello world!

ジェネレータ
PHP Manual