如果这样做..
$stmt = DB::$db->query('SELECT * FROM users');
while ($r = $stmt->fetch()) { print_r($r); }
有没有办法让这样的东西起作用?
function fetch() {
$stmt = DB::$db->query('SELECT * FROM users');
return $stmt->fetch();
}
while ($r = fetch()) { print_r($r); }
更新
或者,如果它在一个类中,它可以通过使用某种类迭代器扩展/实现来工作?
class User {
public static function fetch() {
$stmt = DB::$db->query('SELECT * FROM users');
return $stmt->fetch();
}
}
while ($r = User::fetch()) { print_r($r); }
解
好吧,我最终找到了一个可行的解决方案,但使用生成器的接受答案可能是更好的方法。
class User {
private static $stmt;
public static function fetch() {
if (static::$stmt === null) {
static::$stmt = DB::$db->query('SELECT * FROM users');
}
return static::$stmt->fetch();
}
}
while ($r = User::fetch()) { print_r($r); }
答案 0 :(得分:4)
这样就可以了:
function fetch() {
$stmt = DB::$db->query('SELECT * FROM users');
while($row = $stmt->fetch()) { yield $row; }
}
foreach (fetch() as $r) { print_r($r); }
注意:
yield
是php 5.5 +。foreach
迷你功能上使用fetch()
。您的初始尝试不起作用的原因是该操作只是无限循环。每次调用原始fetch()
进行查询 每次调用 ,从而返回第一个结果。这将使while
继续下去。
答案 1 :(得分:2)
如果你不是在foreach中间而不是在
之前function fetch() {
return DB::$db->query('SELECT * FROM users');
}
foreach (fetch() as $r) { print_r($r); }