PHPyield关键字功能与用法分析

PHPyield关键字功能与用法分析

这篇文章主要介绍了PHP yield关键字功能与用法,结合实例形式分析了php5.5新增的yield关键字功能与相关使用技巧,需要的朋友可以参考下。

本文实例讲述了PHP yield关键字功能与用法。分享给大家供大家参考,具体如下:

yield 关键字是php5.5版本推出的一个特性。

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

Example #1 一个简单的生成值的例子

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
function generateData() {
for ($i = 1; $i <= 3; $i++) {
// //注意变量$i的值在不同的yield之间是保持传递的。
yield $i;
}
}
$data = generateData();// 迭代器对象
foreach ($data as $val) {
echo "{$val}\n";
}

结果:
1
2
3

简单来说就是: yield仅仅是记录迭代过程中的一个过程值

补充示例:

示例2:

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
34
35
36
/**
* 计算平方数列
* @param int $start
* @param int $stop
* @return Generator
*/
function squares($start, $stop) {
if ($start < $stop) {
for ($i = $start; $i <= $stop; $i++) {
yield $i => $i * $i;
}
} else {
for ($i = $start; $i >= $stop; $i--) {
yield $i => $i * $i;// 迭代生成数组:键 => 值
}
}
}

foreach (squares(3, 15) as $n => $square) {
echo $n . ' squares is ' . $square . PHP_EOL;
}

结果:
3 squares is 9
4 squares is 16
5 squares is 25
6 squares is 36
7 squares is 49
8 squares is 64
9 squares is 81
10 squares is 100
11 squares is 121
12 squares is 144
13 squares is 169
14 squares is 196
15 squares is 225

示例3:

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
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
// 对某一个数组进行加权处理
$numbers = array(
'nike' => 200,
'jordan' => 500,
'adiads' => 800,
);
// 通常方法,如果是百万级别的访问数量,这种方法会占用极大内存
function rand_weight($numbers)
{
$total = 0;
foreach ($numbers as $number => $weight) {
$total += $weight;
$distribution[$number] = $total;
}
#var_dump($distribution);
$rand = mt_rand(0, $total - 1);
#echo $rand;
foreach ($distribution as $num => $weight) {
if ($rand < $weight) {
return $num;
}
}
}
echo '使用函数前内存: ' . memory_get_usage() . PHP_EOL;
print(rand_weight($numbers));
echo '使用函数后内存: ' . memory_get_usage() . PHP_EOL;

结果:
使用函数前内存: 353904
adiads使用函数后内存: 353936


// 改用yield生成器
function yield_rand_weight($numbers) {
$total = 0;
foreach ($numbers as $number => $weight) {
$total += $weight;
yield $number => $total;
}
}
function yield_rand_generator($numbers) {
$total = array_sum($numbers);
echo $total;
$rand = mt_rand(0, $total);
foreach (yield_rand_weight($numbers) as $num => $weight) {
if ($rand < $weight) {
return $num;
}
}
}
echo '使用函数前内存: ' . memory_get_usage() . PHP_EOL;
yield_rand_generator($numbers);
echo '使用函数后内存: ' . memory_get_usage() . PHP_EOL;

结果:
使用函数前内存: 354024
1500使用函数后内存: 354056
文章目录
  1. 1. PHPyield关键字功能与用法分析
    1. 1.1. Example #1 一个简单的生成值的例子
    2. 1.2. 补充示例:
      1. 1.2.1. 示例2:
      2. 1.2.2. 示例3:
本站总访问量 | 本页面被访问 | 您是第位小伙伴

© XueSi博客 版权所有 备案号 : 赣ICP备19008485号-1