在PHP文档中它说:
这种灵活性确实需要付出代价:生成器只是前向迭代器,一旦迭代开始就无法重绕。这也意味着同一个生成器不能多次迭代:生成器需要通过再次调用生成器函数来重建,或通过clone关键字克隆。 Documentation
但是我尝试编写一个克隆我从方法收到的生成器对象的代码,并且我收到一条错误,指出无法克隆生成器对象:
class Course {
private $students = array("avi" , "haim" , "maor" , "liran" , "yossi");
function generateStudents() {
foreach ($this->students as $student) {
yield $student;
}
}
}
$ob = new Course();
$generator = $ob->generateStudents();
// Fatal error: Trying to clone an uncloneable object of class Generator
$generator2 = clone $generator;
?>
答案 0 :(得分:7)
According to the RFC,无法克隆生成器:
无法克隆发生器。
初始版本中包含对克隆的支持,但由于实现困难,语义不明确以及没有特别令人信服的用例,因此在PHP 5.5 Beta 3中删除了。
看起来文档反映了初始版本,需要更新。提出了documentation bug来解决这个问题。
同样在RFC中,它指的是您可能不想重用生成器的原因:
在某种程度上复卷违背了生成器的概念,因为它们主要用作不应该再次迭代的一次性数据源。另一方面,大多数生成器可能 可以重新缓存,允许它是有意义的。有人可能会说,倒带发电机实际上是不好的做法(特别是如果发电机做了一些昂贵的计算)。允许它倒带看起来像是一个便宜的操作,就像数组一样。