ホームページ > バックエンド開発 > PHPチュートリアル > PHP ジェネレーター構文の詳細分析

PHP ジェネレーター構文の詳細分析

伊谢尔伦
リリース: 2016-11-23 09:10:13
オリジナル
1209 人が閲覧しました

ジェネレーター関数は通常の関数のように見えますが、違いは、ジェネレーターが単一の値を返すのではなく、オンデマンドで複数の値を生成することです。

ジェネレーター関数が呼び出されると、反復処理を行うと反復可能なオブジェクトが返されます。そのオブジェクトを (たとえば、foreach ループを通じて)、PHP は値が必要になるたびにジェネレーター関数を呼び出し、ジェネレーターが値を生成すると、次回のためにジェネレーターの状態を保存し、値を復元できます。必要に応じて。

それ以上値が生成されない場合、ジェネレーター関数は単に終了でき、配列がすべての値を使い果たしたかのように呼び出しコードが続行されます。

注:

ジェネレーターは値を返すことができません。ジェネレータ内の空の return ステートメントは有効な構文であり、ジェネレータ関数の中心となるのは、yield ステートメントです。 return ステートメントと似ていますが、値を返して実行を停止する代わりに、yield はジェネレーターを参照するコードに値を提供し、その後ジェネレーターの実行を一時停止します。

例 #1 値を返す簡単な例

<?php
    function gen_one_to_three() {
        for ($i = 1; $i <= 3; $i++) {
            // Note that $i is preserved between yields.
            yield $i;
        }
    }
    $generator = gen_one_to_three();
    foreach ($generator as $value) {
         echo "$value\n";
    }
?>
ログイン後にコピー

上記のルーチンは次の出力を行います:

1
2
3
ログイン後にコピー

注:

内部的には、非連想配列と同様に、シリアル化された整数キーが出力値とペアになります。

注意 コンテキスト式を使用する場合、yield を使用する場合 (たとえば、たとえば、次のコードは正しいです:

$data = (yield $value);

しかし、次のコードは解析エラーになります。発生しました:

$data = yield $value;

この構文はジェネレーター オブジェクトの send() メソッドで使用できます

キーを使用して値を取得します

PHP は連想配列をサポートしており、ジェネレーターについても同様です。上に示したように、単純な値を生成するだけでなく、同時にキーを生成することもできます

キーと値のペアを生成するための構文は、以下に示すように、連想配列の定義に使用できます。例 #2 キーと値のペアを生成する

<?php
    /* The input is semi-colon separated fields, with the first
     * field being an ID to use as a key. */
    $input = <<<&#39;EOF&#39;
1;PHP;Likes dollar signs
2;Python;Likes whitespace
3;Ruby;Likes blocks
EOF;
    function input_parser($input) {
        foreach (explode("\n", $input) as $line) {
            $fields = explode(&#39;;&#39;, $line);
            $id = array_shift($fields);
            yield $id => $fields;
        }
    }
    foreach (input_parser($input) as $id => $fields) {
        echo "$id:\n";
        echo " $fields[0]\n";
        echo " $fields[1]\n";
    }
?>
ログイン後にコピー

上記のルーチンは次のように出力します:

1:
    PHP
    Likes dollar signs
2:
    Python
    Likes whitespace
3:
    Ruby
    Likes blocks
ログイン後にコピー

注意: コンテキスト式でキーと値のペアを生成するには、yield ステートメントを で囲む必要があります。括弧:

$data = (yield $key => $value);
ログイン後にコピー

null 値を生成する

Yield は、自動生成されたキーを使用して NULL 値を生成するために引数なしで呼び出すことができます。

例 #3 NULL を生成する

<?php
    function gen_three_nulls() {
        foreach (range(1, 3) as $i) {
            yield;
        }
    }
    var_dump(iterator_to_array(gen_three_nulls()));
?>
ログイン後にコピー

上記のルーチンは次のように出力します。参照による

ジェネレーター関数は参照による値を生成できます。これは、関数名の前に & を追加することで、関数から参照を返すのと同じです。

例 #4 参照による値の生成

array(3) {
    [0]=>NULL
    [1]=>NULL
    [2]=>NULL
}
ログイン後にコピー

上記ルーチンは次のように出力します:

<?php
    function &gen_reference() {
        $value = 3;
        while ($value > 0) {
            yield $value;
        }
    }
    /* 注意我们可以在循环中改变$number
     * because the generator is yielding references, $value
     * within gen_reference() changes. */
    foreach (gen_reference() as &$number) {
        echo (--$number).&#39;... &#39;;
    }
?>
ログイン後にコピー

関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート