如果我实现一个Iterator类来封装PDOStatement,key()方法应该怎么做

时间:2013-02-03 09:41:11

标签: php pdo iterator

我开发了一个接口和类来屏蔽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()方法。有什么想法吗?

1 个答案:

答案 0 :(得分:2)

首先,关于你的界面,我认为你最好扩展CountableIterator,因为你想要添加count()方法,并且在SPL中有一个神奇的界面用于此目的。

关于关键方法。您必须记住在PHP中,每个可迭代内容都是键和值的关联。它继承自PHP数组。

Iterator是一种重载foreach运算符的方法,作为sythax的foreach,由foreach($iterator as $key=>$value)组成,你必须给出关键方法的实现。

在您的情况下,您有两个解决方案:

  • 使用$pdo->cursor
  • 创建自己的名为$ currentKey的属性,并在每次使用next方法时递增它。