php_Generator php 生成器

php_Generator php 生成器

一个生成器函数看起来像一个普通的函数,不同的是普通函数返回一个值,而一个生成器可以yield生成许多它所需要的值。当一个生成器被调用的时候,它返回一个可以被遍历的对象.当你遍历这个对象的时候(例如通过一个foreach循环),PHP 将会在每次需要值的时候调用生成器函数,并在产生一个值之后保存生成器的状态,这样它就可以在需要产生下一个值的时候恢复调用状态。一旦不再需要产生更多的值,生成器函数可以简单退出,而调用生成器的代码还可以继续执行,就像一个数组已经被遍历完了.

Note:一个生成器不可以返回值: 这样做会产生一个编译错误。然而return空是一个有效的语法并且它将会终止生成器继续执行。

yield关键字:

生成器函数的核心是yield关键字。它最简单的调用形式看起来像一个return申明,不同之处在于普通return会返回值并终止函数的执行,而yield会返回一个值给循环调用此生成器的代码并且只是暂停执行生成器函数。

DEMO:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
<?php
// 生成器语法
function xrange($start, $limit, $step){
if ($start < $limit) {
if ($step < 0) {
throw new LogicException('step must +ve');
}

for ($i = $start; $i <= $limit; $i += $step) {
yield $i;
}

} else {
if ($step >= 0) {
throw new LogicException('step must be -ve');
}

for ($i = $step; $i >= $limit; $i += $step) {
yield $i;
}
}
}
print_r(xrange(1, 9, 2));
// 使用php生成器实现range的函数功能
$newarr = array();
foreach(xrange(1, 9, 2) as $key => $val){
array_push($newarr, $val);
}
print_r($newarr);
echo "<br />";
echo '使用range生成数组 <br />';

print_r(range(1, 9, 2));

结果:

1
2
3
4
Generator Object ( )
Array ( [0] => 1 [1] => 3 [2] => 5 [3] => 7 [4] => 9 )
使用range生成数组
Array ( [0] => 1 [1] => 3 [2] => 5 [3] => 7 [4] => 9 )

php 中的yield类似于 js, python 中的 yield 作用.

坚持原创技术分享,您的支持将鼓励我继续创作!
//