һ��������������������һ����ͨ�ĺ�������ͬ������ͨ��������һ��ֵ����һ������������yield�������������Ҫ��ֵ��
��һ�������������õ�ʱ��������һ�����Ա������Ķ���.���������������ʱ��(����ͨ��һ��foreachѭ��)��PHP ������ÿ����Ҫֵ��ʱ��������������������ڲ���һ��ֵ֮����������״̬���������Ϳ�������Ҫ������һ��ֵ��ʱ��ָ�����״̬��
һ��������Ҫ���������ֵ���������������Լ��˳����������������Ĵ��뻹���Լ���ִ�У�����һ�������Ѿ����������ˡ�
Note:
һ�������������Է���ֵ�� �����������һ���������Ȼ��return����һ����Ч���������������ֹ����������ִ�С�
�����������ĺ�����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:
���ڲ���Ϊ���ɵ�ֵ�����������������������һ���ǹ��������顣
�����һ�����ʽ������(������һ����ֵ���ʽ���Ҳ�)��ʹ��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
��֮ǰ���ɼ�ֵ����һ������һ�����ʽ�����������ɼ�ֵ��Ҳ��Ҫʹ��Բ���Ž��а�Χ��
$data = (yield $key => $value);
Yield������û�в������������±�����������һ�� NULL
ֵ�����һ���Զ��ļ�����
Example #3 ����NULL
s
<?php
function gen_three_nulls() {
foreach (range(1, 3) 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...
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 [3, 4];
yield from new ArrayIterator([5, 6]);
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 [3, 4];
yield from new ArrayIterator([5, 6]);
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