php generator 风雪,PHP Generator syntax

本文详细介绍了PHP中的生成器(Generators)语法,包括其工作原理、yield关键字的使用、生成器如何返回值以及如何通过引用方式传递值。通过示例展示了如何创建和使用生成器,以及如何在生成器中生成带有键值对的序列,还提到了生成器可以生成NULL值的情况以及如何生成引用值。
摘要由CSDN通过智能技术生成

Generator syntax

A generator function looks just like a normal function, except that instead

of returning a value, a generator yields as many values as it needs to.

When a generator function is called, it returns an object that can be

iterated over. When you iterate over that object (for instance, via a

foreach loop), PHP will call the generator function each time it needs a

value, then saves the state of the generator when the generator yields a

value so that it can be resumed when the next value is required.

Once there are no more values to be yielded, then the generator function

can simply exit, and the calling code continues just as if an array has run

out of values.

Note:

A generator cannot return a value: doing so will result in a compile

error. An empty return statement is valid syntax within

a generator and it will terminate the generator.

yield keyword

The heart of a generator function is the yield keyword.

In its simplest form, a yield statement looks much like a return

statement, except that instead of stopping execution of the function and

returning, yield instead provides a value to the code looping over the

generator and pauses execution of the generator function.

Example #1 A simple example of yielding values

for ($i=1;$i<=3;$i++) {// Note that $i is preserved between yields.yield $i;

}

}$generator=gen_one_to_three();

foreach ($generatoras$value) {

echo"$value\n";

}?>

以上例程会输出:

1

2

3

Note:

Internally, sequential integer keys will be paired with the yielded

values, just as with a non-associative array.

Caution

If you use yield in an expression context (for example, on the right hand

side of an assignment), you must surround the yield statement with

parentheses. For example, this is valid:

$data = (yield $value);

But this is not, and will result in a parse error:

$data = yield $value;

This syntax may be used in conjunction with the

send() method on

Generator objects.

Yielding values with keys

PHP also supports associative arrays, and generators are no different. In

addition to yielding simple values, as shown above, you can also yield a

key at the same time.

The syntax for yielding a key/value pair is very similar to that used to

define an associative array, as shown below.

Example #2 Yielding a key/value pair

* field being an ID to use as a key. */$input= <<

2;Python;Likes whitespace

3;Ruby;Likes blocksEOF;

functioninput_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

As with the simple value yields shown earlier, yielding a key/value pair

in an expression context requires the yield statement to be

parenthesised:

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

Yielding null values

Yield can be called without an argument to yield a NULL value with an

automatic key.

Example #3 Yielding NULLs

foreach (range(1,3) as$i) {yield;

}

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

以上例程会输出:

array(3) {

[0]=>

NULL

[1]=>

NULL

[2]=>

NULL

}

Yielding by reference

Generator functions are able to yield values by reference as well as by

value. This is done in the same way as

returning references from functions:

by prepending an ampersand to the function name.

Example #4 Yielding values by reference

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

}

}/* Note that we can change $number within the loop, and

* because the generator is yielding references, $value

* within gen_reference() changes. */foreach (gen_reference() as &$number) {

echo (--$number).'... ';

}?>

以上例程会输出:

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值