Üreteçlerin Iterator nesneleriyle karşılaştırılması

Üreteçlerin başlıca getirisi basitlikleridir. Iterator sınıfının gerçeklenmesine kıyasla çok daha az kod yazılır ve kod genelde çok daha okunabilirdir. Örneğin aşağıdaki işlev ve sınıf eşdeğerdir:

<?php
function getLinesFromFile($fileName) {
if (!
$fileHandle = fopen($fileName, 'r')) {
return;
}

while (
false !== $line = fgets($fileHandle)) {
yield
$line;
}

fclose($fileHandle);
}

// versus...

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);
}
}
?>

Bu esnekliğin bir bedeli vardır, üreteçler sadece ileri sayan yineleyiciler olduklarından yineleme bir kere başladı mı bir daha başa sarılamazlar. Bunun bir diğer anlamı, aynı üretecin tekrar tekrar kullanılamamasıdır; üreteç işlevi tekrar çağrılarak üretecin yeniden oluşturulması gerekir.

Ayrıca Bakınız

To Top