我开发了一个接口和类来屏蔽PDOStatement。
界面:
interface ResultSetInterface extends Iterator
{
public function count();
public function all();
}
班级:
class ResultSet implements ResultSetInterface
{
/**
* @var PDOStatement
*/
protected $pdoStatement;
protected $cursor = 0;
protected $current = null;
private $count = null;
public function __construct($pdoStatement)
{
$this->pdoStatement= $pdoStatement;
$this->count = $this->pdoStatement->rowCount();
}
public function rewind()
{
if ($this->cursor > 0) {
throw new Exception('Rewind is not possible');
}
$this->next();
}
public function valid()
{
return $this->cursor <= $this->count;
}
public function next()
{
$this->current = $this->pdoStatement->fetch();
$this->cursor++;
}
public function current()
{
return $this->current;
}
public function key()
{
}
public function count()
{
return $this->count;
}
public function all() {
$this->cursor = $this->count();
return $this->pdoStatement->fetchAll();
}
}
这很好用。但我不确定如何使用实现Iterator类所必需的key()方法。有什么想法吗?
答案 0 :(得分:2)
首先,关于你的界面,我认为你最好扩展CountableIterator
,因为你想要添加count()
方法,并且在SPL中有一个神奇的界面用于此目的。
关于关键方法。您必须记住在PHP中,每个可迭代内容都是键和值的关联。它继承自PHP数组。
Iterator是一种重载foreach
运算符的方法,作为sythax的foreach,由foreach($iterator as $key=>$value)
组成,你必须给出关键方法的实现。
在您的情况下,您有两个解决方案:
$pdo->cursor
next
方法时递增它。