dsasd12314 2018-09-03 10:29
浏览 64

创建但未执行生成器。 延迟加载生成器

I have a following PHP Generator:

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

The thing is, that I need to create Generator, but not to execute any queries to the database yet. Something like lazy read(...) initiation.

An example:

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

Any ideas?

Note: that it is a hypothetical scenario. One of the solution to be creating a lazy iterator, which would execute DatabaseReader::read on a very first iteration and proxy all methods to the \Generator created by read(...)

  • 写回答

0条回答 默认 最新

    报告相同问题?

    悬赏问题

    • ¥15 oracle集群安装出bug
    • ¥15 关于#python#的问题:自动化测试
    • ¥20 问题请教!vue项目关于Nginx配置nonce安全策略的问题
    • ¥15 教务系统账号被盗号如何追溯设备
    • ¥20 delta降尺度方法,未来数据怎么降尺度
    • ¥15 c# 使用NPOI快速将datatable数据导入excel中指定sheet,要求快速高效
    • ¥15 再不同版本的系统上,TCP传输速度不一致
    • ¥15 高德地图2.0 版本点聚合中Marker的位置无法实时更新,如何解决呢?
    • ¥15 DIFY API Endpoint 问题。
    • ¥20 sub地址DHCP问题