2014-04-04 11 views
7

Nella documentazione di PHP si dice che:I generatori PHP possono essere clonati?

Questa flessibilità non hanno un costo, però: i generatori sono forward-only iteratori, e non possono essere riavvolti una volta che l'iterazione è iniziata. Ciò significa anche che lo stesso generatore non può essere iterato più volte: il generatore dovrà essere ricostruito chiamando di nuovo la funzione generatore, o clonato tramite la parola chiave clone. Documentation

Tuttavia ho provato a scrivere un codice che clona l'oggetto generatore che ho ricevuto da un metodo e ho ottenuto un errore che specifica che un oggetto generatore sopraelevazione essere clonato:

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

Si prega di rendere la vostra domanda più chiara. –

risposta

4

According to the RFC, generatori non può essere clonato:

I generatori non possono essere clonati.

Il supporto per la clonazione è stato incluso nella versione iniziale, ma rimosso in PHP 5.5 Beta 3 a causa di difficoltà di implementazione, semantica non chiara e nessun caso di utilizzo particolarmente convincente.

Sembra che la documentazione rifletta la versione iniziale e che sia necessario aggiornarla. C'è un aumento di documentation bug per risolvere questo problema.

Anche nella RFC, si riferisce a motivi per cui si potrebbe non voler riutilizzare un generatore:

riavvolgimento in una certa misura va contro il concetto di generatori, in quanto sono intesi principalmente come una volta fonti di dati che non dovrebbero essere ripetute un'altra volta. D'altra parte, la maggior parte dei generatori probabilmente è riavvolgibile e potrebbe avere senso permetterlo. Si potrebbe obiettare, tuttavia, che riavvolgere un generatore è una pratica veramente brutta (specialmente se il generatore sta facendo un calcolo costoso). Consentendo di riavvolgere sembrerebbe un'operazione a basso costo, proprio come con gli array.

Problemi correlati