【发布时间】:2013-06-17 21:49:58
【问题描述】:
今天,PHP 团队发布了PHP 5.5.0 版本,其中包括对generators 的支持。阅读the documentation,我注意到它完全可以用数组来做。
PHP 团队生成器示例:
// Only PHP 5.5
function gen_one_to_three() {
for ($i = 1; $i <= 3; $i++) {
// Note that $i is preserved between yields.
yield $i;
}
}
$generator = gen_one_to_three();
foreach ($generator as $value) {
echo "$value\n";
}
结果:
1
2
3
但是我可以使用数组来做同样的事情。而且我仍然可以与早期版本的 PHP 保持兼容。
看看:
// Compatible with 4.4.9!
function gen_one_to_three() {
$results = array();
for ($i = 1; $i <= 3; $i++) {
$results[] = $i;
}
return $results;
}
$generator = gen_one_to_three();
foreach ($generator as $value) {
echo "$value\n";
}
那么问题来了:这个新功能存在的目的是什么?我必须在不使用新功能的情况下播放所有文档示例,将其替换为数组。
任何人都可以给出一个很好的解释,也许是一个旧版本不一定不可能的例子,但是使用生成器可以帮助开发?
【问题讨论】:
-
数组是元素的物化序列。生成器是一个生成序列的函数(一次一个元素)。立即将生成器的结果转换为数组(这会强制实现,因此相当于创建数组开始!)并不是很有趣 - 使用生成器作为 stream 是它开始的地方付清。只需要计算需要 的元素。考虑生成 N 个斐波那契数 ..
-
有关该功能的更详细说明,您应该查看 RFC:wiki.php.net/rfc/generators
-
@user2246674 - 在我的回答中适当地添加了一个斐波那契示例 :)
标签: php arrays iterator generator