我知道不用生成器就可以很容易地对其进行归档,但是我想更好地理解生成器。因此,请不要建议使用其他东西。
我有一个为屏幕快照(硒)生成文件名的类:
class ScreenshotName
{
private $counter = 0;
public function screenshotNameIterator()
{
while(true) {
yield sprintf("screenshot-%s-%s.png", date("Y-m-d\\TH:i:s"), ++$this->counter);
}
}
}
现在,我的问题是:除了foreach循环之外,是否可以在其他任何上下文中使用这样的生成器?例如
(new ScreenshotName())->screenshotNameIterator()->next()
对我来说,这总是返回null,如果我调试,它永远不会进入generator方法。 PHP文档也没有真正提到这一点。
所以我的问题是:是有没有一种书面方法可以在不同于for循环的上下文中使用生成器?
有记录的方法可以做到这一点。实际上,正如您在page上看到的那样,Generator确实实现了迭代器接口。
实际上foreach
关键字仅在迭代器上有效。因此,如果可以在生成器上使用foreach
,则必须能够调用next
这里是使用next
而不是foreach
的示例代码:
<?php
function evenNumbers() {
for ($i = 0;; $i++) {
yield 2*$i;
}
}
$gen = evenNumbers();
$gen->next();
echo $gen->current();
?>
这里是Dark Duck's answer附带的完整代码段。也就是说,它演示了如何使用Iterator接口迭代所有值。 (Dark Duck的代码不完整。)基于a comment by robert_e_lee on Iterator doc: