PHP中yield关键字如何实现生成器功能及其具体用法详解?
- 内容介绍
- 文章标签
- 相关推荐
本文共计823个文字,预计阅读时间需要4分钟。
PHP的`yield`关键字是PHP 5.5版本引入的一个特性,它主要用于生成器函数中。生成器函数允许你创建一个迭代器,每次调用时只返回序列中的一个值,而不是一次性返回所有值。以下是对`yield`关键字及其用法的简单描述:
`yield`关键字在生成器函数中用于返回值,但与传统的返回值不同,它不会结束函数的执行。每次调用生成器函数时,它都会暂停执行,直到下一次调用`next()`方法时才继续执行。
例如:phpfunction generateNumbers() { yield 1; yield 2; yield 3;}
$gen=generateNumbers();foreach ($gen as $number) { echo $number . PHP_EOL;}输出:
12
3
在这个例子中,`generateNumbers`是一个生成器函数,它使用`yield`关键字返回序列中的数字。通过遍历`$gen`,可以逐个获取这些数字,而不会一次性加载到内存中。
`yield`关键字的主要优势包括:
- 减少内存使用,因为生成器函数每次只处理一个值。- 提高代码的可读性和可维护性,特别是在处理大量数据时。总之,`yield`关键字是PHP中一个强大的特性,它允许开发者以更高效、更灵活的方式处理数据序列。
本文实例讲述了PHP yield关键字功能与用法。分享给大家供大家参考,具体如下:
yield 关键字是php5.5版本推出的一个特性。生成器函数的核心是yield关键字。它最简单的调用形式看起来像一个return申明,不同之处在于普通return会返回值并终止函数的执行,而yield会返回一个值给循环调用此生成器的代码并且只是暂停执行生成器函数。
Example #1 一个简单的生成值的例子
<?php function gen_one_to_three() { for ($i = 1; $i <= 3; $i++) { //注意变量$i的值在不同的yield之间是保持传递的。 yield $i; } } $generator = gen_one_to_three(); foreach ($generator as $value) { echo "$value\n"; } ?>
简单来说就是:yield是仅仅是记录迭代过程中的一个过程值
补充示例:
示例2:
/** * 计算平方数列 * @param $start * @param $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 . ‘squared is‘ . $square . ‘<br>‘; }
输出:
3 squared is 9
4 squared is 16
5 squared is 25
...
示例3:
//对某一数组进行加权处理 $numbers = array(‘nike‘ => 200, ‘jordan‘ => 500, ‘adiads‘ => 800); //通常方法,如果是百万级别的访问量,这种方法会占用极大内存 function rand_weight($numbers) { $total = 0; foreach ($numbers as $number => $weight) { $total += $weight; $distribution[$number] = $total; } $rand = mt_rand(0, $total-1); foreach ($distribution as $num => $weight) { if ($rand < $weight) return $num; } } //改用yield生成器 function mt_rand_weight($numbers) { $total = 0; foreach ($numbers as $number => $weight) { $total += $weight; yield $number => $total; } } function mt_rand_generator($numbers) { $total = array_sum($numbers); $rand = mt_rand(0, $total -1); foreach (mt_rand_weight($numbers) as $num => $weight) { if ($rand < $weight) return $num; } }
更多关于PHP相关内容感兴趣的读者可查看本站专题:《php面向对象程序设计入门教程》、《PHP数组(Array)操作技巧大全》、《PHP基本语法入门教程》、《PHP运算与运算符用法总结》、《php字符串(string)用法总结》、《php+mysql数据库操作入门教程》及《php常见数据库操作技巧汇总》
希望本文所述对大家PHP程序设计有所帮助。
本文共计823个文字,预计阅读时间需要4分钟。
PHP的`yield`关键字是PHP 5.5版本引入的一个特性,它主要用于生成器函数中。生成器函数允许你创建一个迭代器,每次调用时只返回序列中的一个值,而不是一次性返回所有值。以下是对`yield`关键字及其用法的简单描述:
`yield`关键字在生成器函数中用于返回值,但与传统的返回值不同,它不会结束函数的执行。每次调用生成器函数时,它都会暂停执行,直到下一次调用`next()`方法时才继续执行。
例如:phpfunction generateNumbers() { yield 1; yield 2; yield 3;}
$gen=generateNumbers();foreach ($gen as $number) { echo $number . PHP_EOL;}输出:
12
3
在这个例子中,`generateNumbers`是一个生成器函数,它使用`yield`关键字返回序列中的数字。通过遍历`$gen`,可以逐个获取这些数字,而不会一次性加载到内存中。
`yield`关键字的主要优势包括:
- 减少内存使用,因为生成器函数每次只处理一个值。- 提高代码的可读性和可维护性,特别是在处理大量数据时。总之,`yield`关键字是PHP中一个强大的特性,它允许开发者以更高效、更灵活的方式处理数据序列。
本文实例讲述了PHP yield关键字功能与用法。分享给大家供大家参考,具体如下:
yield 关键字是php5.5版本推出的一个特性。生成器函数的核心是yield关键字。它最简单的调用形式看起来像一个return申明,不同之处在于普通return会返回值并终止函数的执行,而yield会返回一个值给循环调用此生成器的代码并且只是暂停执行生成器函数。
Example #1 一个简单的生成值的例子
<?php function gen_one_to_three() { for ($i = 1; $i <= 3; $i++) { //注意变量$i的值在不同的yield之间是保持传递的。 yield $i; } } $generator = gen_one_to_three(); foreach ($generator as $value) { echo "$value\n"; } ?>
简单来说就是:yield是仅仅是记录迭代过程中的一个过程值
补充示例:
示例2:
/** * 计算平方数列 * @param $start * @param $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 . ‘squared is‘ . $square . ‘<br>‘; }
输出:
3 squared is 9
4 squared is 16
5 squared is 25
...
示例3:
//对某一数组进行加权处理 $numbers = array(‘nike‘ => 200, ‘jordan‘ => 500, ‘adiads‘ => 800); //通常方法,如果是百万级别的访问量,这种方法会占用极大内存 function rand_weight($numbers) { $total = 0; foreach ($numbers as $number => $weight) { $total += $weight; $distribution[$number] = $total; } $rand = mt_rand(0, $total-1); foreach ($distribution as $num => $weight) { if ($rand < $weight) return $num; } } //改用yield生成器 function mt_rand_weight($numbers) { $total = 0; foreach ($numbers as $number => $weight) { $total += $weight; yield $number => $total; } } function mt_rand_generator($numbers) { $total = array_sum($numbers); $rand = mt_rand(0, $total -1); foreach (mt_rand_weight($numbers) as $num => $weight) { if ($rand < $weight) return $num; } }
更多关于PHP相关内容感兴趣的读者可查看本站专题:《php面向对象程序设计入门教程》、《PHP数组(Array)操作技巧大全》、《PHP基本语法入门教程》、《PHP运算与运算符用法总结》、《php字符串(string)用法总结》、《php+mysql数据库操作入门教程》及《php常见数据库操作技巧汇总》
希望本文所述对大家PHP程序设计有所帮助。

