�������﷨

һ��������������������һ����ͨ�ĺ�������ͬ������ͨ��������һ��ֵ����һ������������yield�������������Ҫ��ֵ��

��һ�������������õ�ʱ��������һ�����Ա������Ķ���.���������������ʱ��(����ͨ��һ��foreachѭ��)��PHP ������ÿ����Ҫֵ��ʱ��������������������ڲ���һ��ֵ֮�󱣴���������״̬���������Ϳ�������Ҫ������һ��ֵ��ʱ��ָ�����״̬��

һ��������Ҫ���������ֵ���������������Լ��˳����������������Ĵ��뻹���Լ���ִ�У�����һ�������Ѿ����������ˡ�

Note:

һ�������������Է���ֵ�� �����������һ���������Ȼ��return����һ����Ч���﷨������������ֹ����������ִ�С�

yield�ؼ���

�����������ĺ�����yield�ؼ��֡�����򵥵ĵ�����ʽ��������һ��return��������֮ͬ��������ͨreturn�᷵��ֵ����ֹ������ִ�У���yield�᷵��һ��ֵ��ѭ�����ô��������Ĵ��벢��ֻ����ִͣ��������������

Example #1 һ���򵥵�����ֵ������

<?php
function gen_one_to_three() {
    for (
$i 1$i <= 3$i++) {
        
//ע�����$i��ֵ�ڲ�ͬ��yield֮���DZ��ִ��ݵġ�
        
yield $i;
    }
}

$generator gen_one_to_three();
foreach (
$generator as $value) {
    echo 
"$value\n";
}
?>

�������̻������

1
2
3

Note:

���ڲ���Ϊ���ɵ�ֵ�����������������������һ���ǹ��������顣

Caution

�����һ�����ʽ������(������һ����ֵ���ʽ���Ҳ�)��ʹ��yield�������ʹ��Բ���Ű�yield������Χ������ ������������Ч�ģ�

$data = (yield $value);

�������Ͳ��Ϸ���������PHP5�л����һ���������

$data = yield $value;

The parenthetical restrictions do not apply in PHP 7.

����﷨���Ժ������������Generator::send()�������ʹ�á�

ָ������������ֵ

PHP������֧�ֹ�����ֵ�����飬������Ҳһ��֧�֡����Գ������ɼ򵥵�ֵ����Ҳ����������ֵ��ʱ��ָ��������

������ʾ������һ����ֵ���붨��һ����������ʮ�����ơ�

Example #2 ����һ����ֵ��

<?php
/* 
 * ����ÿһ�����÷ֺŷָ���ֶ���ϣ���һ���ֶν�������������
 */

$input = <<<'EOF'
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(';'$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
Caution

��֮ǰ���ɼ�ֵ����һ������һ�����ʽ�����������ɼ�ֵ��Ҳ��Ҫʹ��Բ���Ž��а�Χ��

$data = (yield $key => $value);

����nullֵ

Yield������û�в������������±�����������һ�� NULLֵ�����һ���Զ��ļ�����

Example #3 ����NULLs

<?php
function gen_three_nulls() {
    foreach (
range(13) as $i) {
        yield;
    }
}

var_dump(iterator_to_array(gen_three_nulls()));
?>

�������̻������

array(3) {
  [0]=>
  NULL
  [1]=>
  NULL
  [2]=>
  NULL
}

ʹ������������ֵ

���ɺ���������ʹ��ֵһ����ʹ���������ɡ������returning references from functions���Ӻ�������һ�����ã�һ����ͨ���ں�����ǰ���һ�����÷��š�

Example #4 ʹ������������ֵ

<?php
function &gen_reference() {
    
$value 3;

    while (
$value 0) {
        yield 
$value;
    }
}

/* 
 * ���ǿ�����ѭ�����޸�$number��ֵ������������ʹ�õ�����ֵ�����ɣ�����gen_reference()�ڲ���$valueֵҲ����ű仯��
 */
foreach (gen_reference() as &$number) {
    echo (--
$number).'... ';
}
?>

�������̻������

2... 1... 0... 

Generator delegation via yield from

In PHP 7, generator delegation allows you to yield values from another generator, Traversable object, or array by using the yield from keyword. The outer generator will then yield all values from the inner generator, object, or array until that is no longer valid, after which execution will continue in the outer generator.

If a generator is used with yield from, the yield from expression will also return any value returned by the inner generator.

Example #5 Basic use of yield from

<?php
function count_to_ten() {
    yield 
1;
    yield 
2;
    yield from [
34];
    yield from new 
ArrayIterator([56]);
    yield from 
seven_eight();
    yield 
9;
    yield 
10;
}

function 
seven_eight() {
    yield 
7;
    yield from 
eight();
}

function 
eight() {
    yield 
8;
}

foreach (
count_to_ten() as $num) {
    echo 
"$num ";
}
?>

�������̻������

1 2 3 4 5 6 7 8 9 10 

Example #6 yield from and return values

<?php
function count_to_ten() {
    yield 
1;
    yield 
2;
    yield from [
34];
    yield from new 
ArrayIterator([56]);
    yield from 
seven_eight();
    return yield from 
nine_ten();
}

function 
seven_eight() {
    yield 
7;
    yield from 
eight();
}

function 
eight() {
    yield 
8;
}

function 
nine_ten() {
    yield 
9;
    return 
10;
}

$gen count_to_ten();
foreach (
$gen as $num) {
    echo 
"$num ";
}
echo 
$gen->getReturn();
?>

�������̻������

1 2 3 4 5 6 7 8 9 10