2014-04-04 54 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,它指的原因,你可能不希望重用發電機:

復卷在一定程度上違背了發電機的概念,因爲他們主要是打算作爲一次性那些不應該被重複的數據源。另一方面,大多數發電機可能是,它們是可回放的,它可能是有意義的。有人可能會說,重繞發電機是非常糟糕的做法(特別是如果發電機正在做一些昂貴的計算)。讓它倒帶看起來像是一個便宜的操作,就像數組一樣。