W3Cschool
恭喜您成為首批注冊用戶
獲得88經(jīng)驗值獎勵
生成器最主要的優(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->fileHandle, 0);
$this->line = fgets($this->fileHandle);
$this->i = 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ù),重新生成后再遍歷。
Copyright©2021 w3cschool編程獅|閩ICP備15016281號-3|閩公網(wǎng)安備35020302033924號
違法和不良信息舉報電話:173-0602-2364|舉報郵箱:jubao@eeedong.com
掃描二維碼
下載編程獅App
編程獅公眾號
聯(lián)系方式:
更多建議: