已创建但未执行的Generator。延迟加载的发电机

时间:2018-09-03 10:29:43

标签: php generator

我有以下PHP生成器:

<?php

class DatabaseReader
{
    private $database;

    ...

    public function read(int $batchSize): \Generator
    {
        $fromId = 0;

        do {
            $data = $this->database->query("SELECT * FROM Users WHERE id > $fromId LIMIT $batchSize"); // dummy example

            foreach ($data as $row) {
                $fromId = $row['id'];

                yield $row;
            }
        } while ($batchSize === count($data));
    }
}

问题是,我需要创建Generator,但还不需要执行对数据库的任何查询。像是read(...)惰性启动。

一个例子:

<?php

function printMyData(\Iterator $iterator) {
    foreach ($iterator as $element) { // Execute the first Database query
        var_dump($element);
    }
}

$reader = new DatabaseReader(...);

...

// some logic here.

$iterator = $reader->read(...); // I want to have a Generator object here, but not executed `read(...)`.

...
// some other work here
// at this point, no queries should be executed yet
...

printMyData($iterator);

有什么想法吗?

注意:这是一个假设的场景。创建延迟迭代器的一种解决方案,该迭代器将在第一次迭代时执行DatabaseReader::read并将所有方法代理到\Generator创建的read(...)

0 个答案:

没有答案