У меня есть следующий генератор 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));
}
}
Дело в том, что мне нужно создать генератор, но пока не выполнять никаких запросов к базе данных. Что-то вроде ленивой инициации 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(...)