PHP入門:Generatorsについて -vol.5-

スポンサーリンク
PHP入門:Generatorsについて -vol.5- 用語解説
PHP入門:Generatorsについて -vol.5-
この記事は約4分で読めます。
よっしー
よっしー

こんにちは。よっしーです(^^)

今日は、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についてご紹介しました。

よっしー
よっしー

何か質問や相談があれば、コメントをお願いします。また、エンジニア案件の相談にも随時対応していますので、お気軽にお問い合わせください。

それでは、また明日お会いしましょう(^^)

コメント

タイトルとURLをコピーしました