よっしー
こんにちは。よっしーです(^^)
今日は、PHPのGeneratorsについてご紹介します。
背景
PHP8.2を利用したAPIを開発しているときにGeneratorsを利用したので、そのときの調査内容を備忘としてのこしました。
こちらのサイトを参考にしています。
ジェネレータとIteratorオブジェクトの比較
ジェネレータの主な利点は、そのシンプルさです。Iteratorクラスを実装する場合に比べて、ずっと少ないボイラープレートコードを記述する必要があり、コードは一般的にはずっと読みやすくなります。例えば、以下の関数とクラスは同等です:
<?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);
}
}
しかし、この柔軟性にはコストがかかります。ジェネレータは前方にしか進めないイテレータであり、一度反復処理が始まると巻き戻すことはできません。これはまた、同じジェネレータを複数回反復処理できないことを意味します。ジェネレータは、再度ジェネレータ関数を呼び出して再構築する必要があります。
おわりに
今日は、PHPのGeneratorsについてご紹介しました。
よっしー
何か質問や相談があれば、コメントをお願いします。また、エンジニア案件の相談にも随時対応していますので、お気軽にお問い合わせください。
それでは、また明日お会いしましょう(^^)
コメント