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

PHP 7のジェネレーター戻り式(Return Expressions)の使い方と実例

PHPの以前のバージョンでは、ジェネレーター関数から式を返すことができませんでした。しかしPHP 5.5以降、既存のジェネレーター機能に「戻り式(return expression)」が追加されました。この機能を利用することで、ジェネレーター内でreturnステートメントを自然に記述できるようになり、最後に評価された式の値を返すことも可能になります。

  • ジェネレーターの戻り式では、式の「値」を返すことのみが可能で、「参照」を返すことはできません。新しく追加されたGenerator::getReturn()メソッドを使えば、ジェネレーター関数が定義済みの値のyieldをすべて完了した後、その戻り値を取得できます。
  • PHP 7のジェネレーターでは、戻り式によって最終的な値を返せます。$generator->getReturn()を呼び出すことで戻り値を取得できます。PHP 7では、ジェネレーターを実行するクライアントコード側が結果を保持できる形で、コルーチンの処理の最終値をジェネレーターから返すことが可能になりました。

ジェネレーターの戻り式:サンプルコード1

<html>
<head>
<title> PHP 7 Feature : Generator Return Expressions </title>
</head>
<body>
<?php
    $generator = (function(){
        yield "five";
        yield "six";
        yield "seven";
        return "eight";
    })
    ();
    foreach ($generator as $val){
        echo $val, PHP_EOL;
    }
    echo $generator ->getReturn(), PHP_EOL;
?>
</body>
</html>

出力結果

上記のPHPプログラムを実行すると、以下の出力が得られます。

five six seven eight

サンプルコード1の解説

  • まず、エディタでHTMLコードを記述し、bodyタグ内にジェネレーターの戻り式を扱うPHP 7のコードを組み込みます。
  • 次に、変数$generatorに、無名関数として定義したジェネレーターを代入します。
  • $generatorの内部では、"five"、"six"、"seven"を順にyieldし、最後に"eight"をreturnで返しています。
  • 最後に、foreachループで$generatorを最後まで反復処理しながらyieldされた値を出力し、続けてgetReturn()メソッドでジェネレーターの戻り値を出力しています。

ジェネレーターの戻り式:サンプルコード2

<html>
<head>
<title> PHP 7 Feature: Generator Return Expressions Example </title>
</head>
<body>
<?php
    function gen(){
        yield 'A';
        yield 'B';
        yield 'C';
        return 'gen-return';
    }
    $generator = gen();
    var_dump($generator);
    foreach ($generator as $letter){
        echo $letter;
    }
    var_dump($generator->getReturn());
?>
</body>
</html>

出力結果

上記のPHPプログラムを実行すると、以下の出力が得られます。

object(Generator)#1 (0) { }ABCstring(10) "gen-return"

サンプルコード2の解説

  • gen()関数内では、"A"、"B"、"C"を順にyieldし、最後に"gen-return"という文字列をreturnで返しています。
  • var_dump()で$generatorを確認すると、Generatorクラスのオブジェクトであることがわかります。
  • foreachによる反復処理では、yieldされた値のみが順に出力され、"ABC"と表示されます。return値はこの段階ではまだ取得されません。
  • 反復処理が完了した後にgetReturn()メソッドを呼び出すことで、returnで返された10バイトの文字列"gen-return"を取得できます。

注意点

getReturn()メソッドを呼び出せるのは、ジェネレーターの反復処理が完了した後のみです。反復が完了する前に呼び出すとExceptionがスローされるため、必ずforeachなどの反復処理を終えてから呼び出すようにしましょう。

  1. PHPのpi()関数とは?使い方と定義済み定数との対応を実例付きで解説

    pi()関数の定義と使い方PHPのpi()関数は、数学定数π(円周率)の値を返す関数です。戻り値はfloat型の「3.14159265359」であり、PHPにあらかじめ定義されている定数M_PIとまったく同じ値になります。構文pi ( void ) : floatパラメータこの関数は引数を受け取りません。引数なしでそのまま呼び出すことができます。戻り値pi()関数は数学定数πの値を返し、定義済みの数学定数M_PIと等価です。数式の中では、M_PIの代わりにpi()関数を使うこともできます。対応するPHPバージョンこの関数はPHP 4.x、PHP 5.x、PHP 7.xのすべてのバージョンで利用

  2. PHPのpathinfo()でUTF-8ファイル名を正しく取得する方法

    PHPのpathinfo()でUTF-8ファイル名を正しく取得する方法PHPのコア関数の多くは、Latin-1(ISO-8859-1)以外の文字セットを正しく扱うことができません。そのため、日本語などのマルチバイト文字を含むファイル名をpathinfo()に渡しても、期待どおりの結果が得られない場合があります。しかし、pathinfo()を呼び出す前にsetlocale()でロケールを適切に設定しておけば、UTF-8でエンコードされたファイル名でも正しい結果を取得できるようになります。ロケールの初期設定についてデフォルトでは、PHPは「C」ロケールで動作します。一方、CLIスクリプトは多くの環