可以克隆PHP生成器吗?

时间:2014-04-04 09:05:21

标签: php oop clone generator

在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;

?>

1 个答案:

答案 0 :(得分:7)

According to the RFC,无法克隆生成器:

  

无法克隆发生器。

     

初始版本中包含对克隆的支持,但由于实现困难,语义不明确以及没有特别令人信服的用例,因此在PHP 5.5 Beta 3中删除了。

看起来文档反映了初始版本,需要更新。提出了documentation bug来解决这个问题。

同样在RFC中,它指的是您可能不想重用生成器的原因:

  

在某种程度上复卷违背了生成器的概念,因为它们主要用作不应该再次迭代的一次性数据源。另一方面,大多数生成器可能 可以重新缓存,允许它是有意义的。有人可能会说,倒带发电机实际上是不好的做法(特别是如果发电机做了一些昂贵的计算)。允许它倒带看起来像是一个便宜的操作,就像数组一样。