2014-04-04 55 views
7

在PHP文件它说:可以克隆PHP生成器吗?

这种灵活性也不过是有代价的,:发电机只进迭代器,一旦迭代开始无法倒带。这也意味着相同的生成器不能迭代多次:生成器需要通过再次调用生成器函数来重建,或通过克隆关键字进行克隆。 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; 

?> 
+2

请让你的问题更清楚。 –

回答

4

According to the RFC,发电机不能被克隆:

发电机不能克隆。

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

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

另外,在RFC,它指的原因,你可能不希望重用发电机:

复卷在一定程度上违背了发电机的概念,因为他们主要是打算作为一次性那些不应该被重复的数据源。另一方面,大多数发电机可能是,它们是可回放的,它可能是有意义的。有人可能会说,重绕发电机是非常糟糕的做法(特别是如果发电机正在做一些昂贵的计算)。让它倒带看起来像是一个便宜的操作,就像数组一样。