PHP
 Computer >> コンピューター >  >> プログラミング >> PHP

PHP 7のジェネレーター委譲(yield from)の基本と実践的な使い方を解説

ジェネレーターという概念は、PHP 7で新しく導入されたものではありません。以前のバージョンから利用可能でした。ジェネレーターを使うことで、Iteratorインターフェースを実装したクラスを作成するオーバーヘッドなしに、簡単にイテレーション処理を実装できます。

ジェネレーターを活用すると、メモリ上に配列を用意することなくforeachループのコードを書くことが可能になります。その結果、「メモリ制限超過エラー(Allowed memory size exhausted)」の発生を防ぐことにも役立ちます。

さらに、PHP 7で追加されたジェネレーター委譲の機能により、あるジェネレーターから別のジェネレーターへ自動的に処理を委譲できるようになりました。委譲先としては、配列やTraversableインターフェースを実装したオブジェクトも指定できます。

ジェネレーター委譲のサンプルコード

<html>
<head>
<title> PHP 7 : Tutorialpoint </title>
</head>
<body>
<?php
    function generator(){
        yield "zero";
        yield "one";
        yield "two";
    }
    function generator1(){
        yield "three";
        yield "four";
        yield "five";
    }
    function generator2(){
        yield "six";
        yield "seven";
        yield "eight";
        yield from generator();
        yield "nine";
        yield from generator1();
        yield "ten";
    }
    foreach (generator() as $value){
        echo $value, PHP_EOL;
    }
    foreach(generator2() as $value){
        echo $value, PHP_EOL;
    }
?>
</body>
</html>

実行結果

上記のPHPプログラム(ジェネレーター委譲)を実行すると、次のような出力が得られます。

zero one two six seven eight zero one two nine three four five ten

コードの解説

  • まず、サンプルコードをエディタに入力し、HTMLのbody部分に実際のPHP 7コードを記述します。
  • 次に、3つの関数「generator」「generator1」「generator2」を宣言しています。
  • 「generator」関数内では、yieldキーワードによって「zero」「one」「two」という値を順番に返すよう定義しています。
  • 「generator1」関数では、「three」「four」「five」の値をyieldで返します。
  • 「generator2」関数では、「six」「seven」「eight」をyieldした後、yield from構文を使って「generator」関数へ処理を委譲します。その後「nine」を返し、再びyield fromで「generator1」へ委譲し、最後に「ten」を返します。
  • 最後に、foreachループで「generator」と「generator2」の各関数を反復処理し、yieldされたすべての値を出力するまで繰り返します。

このようにyield fromを使うことで、複数のジェネレーターの出力を一つのシーケンスとしてまとめて扱えるため、大規模なデータ処理やストリーム処理のコードをよりシンプルかつ可読性高く記述できます。

  1. JavaScriptのジェネレーター関数とは?yieldの仕組みと使い方を実例で解説

    JavaScriptのジェネレーター関数(Generator Function)は、yieldキーワードを使って値を順番に生成できる特別な関数です。通常の関数と異なり、一度値を返してもその内部状態(実行位置や変数など)が保持されるため、次に呼び出されたときには、前回yieldを実行した直後の続きから処理を再開できます。 ジェネレーター関数を呼び出すたびに、呼び出し元へ新しい値が1つずつ返されます。この仕組みにより、大量のデータを一括生成するのではなく、必要なタイミングで少しずつ値を取り出すことが可能になります。 ジェネレーター関数の基本的な特徴 関数宣言時に function* を使用して定

  2. Pythonジェネレーター徹底解説:yieldの基本からメモリ効率化テクニックまで

    Pythonにおけるジェネレーターは、PEP 255で導入されて以来、言語の中核を担う重要な機能の一つとなっています。本記事では、ジェネレーターの基本的な概念から、実際のコード例、そして大規模データ処理におけるメモリ効率化の実践テクニックまで、詳しく解説します。 ジェネレーターとは何か ジェネレーターとは、ループの反復動作を制御するための特別なルーチンです。配列を返す関数に似ていますが、決定的な違いがあります。通常の関数が配列全体を一度に返すのに対し、ジェネレーターは値を1つずつ生成(yield)します。これにより、必要なメモリ量を大幅に抑えることができます。 「yield」キーワードを含