生成器與 Iterator 對象的比較

生成器最主要的優(yōu)點是簡潔。和實現(xiàn)一個 Iterator 類相較而言, 同樣的功能,用生成器可以編寫更少的代碼,可讀性也更強。 舉例,下面的類和函數(shù)是相等的:

<?php
function getLinesFromFile($fileName) {
    if (!
$fileHandle fopen($fileName'r')) {
        return;
    }
 
    while (
false !== $line fgets($fileHandle)) {
        yield 
$line;
    }
 
    
fclose($fileHandle);
}

// 比較下...

class LineIterator implements Iterator {
    protected 
$fileHandle;
 
    protected 
$line;
    protected 
$i;
 
    public function 
__construct($fileName) {
        if (!
$this->fileHandle fopen($fileName'r')) {
            throw new 
RuntimeException('Couldn\'t open file "' $fileName '"');
        }
    }
 
    public function 
rewind() {
        
fseek($this->fileHandle0);
        
$this->line fgets($this->fileHandle);
        
$this->0;
    }
 
    public function 
valid() {
        return 
false !== $this->line;
    }
 
    public function 
current() {
        return 
$this->line;
    }
 
    public function 
key() {
        return 
$this->i;
    }
 
    public function 
next() {
        if (
false !== $this->line) {
            
$this->line fgets($this->fileHandle);
            
$this->i++;
        }
    }
 
    public function 
__destruct() {
        
fclose($this->fileHandle);
    }
}
?>

不過,這也付出了靈活性的代價: 生成器是一個只能向前的迭代器,一旦開始遍歷就無法后退。 意思也就是說,同樣的生成器無法遍歷多遍:要么再次調(diào)用生成器函數(shù),重新生成后再遍歷。

參見