Я понимаю, что это довольно общий вопрос, а другой ответ является прямым ответом на него.
Однако, поскольку этот вопрос помечен PDO, а ваш реальный пример касается именно этого конкретного API, тамэто гораздо более простой способ достижения вашей цели: с учетом того, что PDOStatement уже пройден, вы можете написать эту функцию следующим образом:
public function getRows(string $query, array $parameters = []): PDOStatement
{
$stmt = $this->pdo->prepare($query);
$res = $stmt->execute($parameters);
return $stmt;
}
, тогда вы можете использовать ее так же, как и функцию генератора:
$sql = "SELECT * FROM users WHERE salary > ?";
foreach ($db->getRows($sql, [0]) as $row) {
// whatever
}
когда цикл будет завершен, так или иначе, $ stmt будет обнулен и, таким образом, курсор будет автоматически закрыт.
В качестве бонуса вы можете дать этой функции более общее имя и использовать его для любого запроса, например, INSERT или DELETE.
Также, важное замечание: если вы ожидаете результатаустановите это большое значение, рассмотрите возможность использования небуферизованного запроса , так как в противном случае ваша оперативная память будет израсходована , несмотря на выборку строк одна за другой.