0

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

4

1 回答 1

2

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

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

迭代器是一种重载foreach运算符的方法,并且作为一个 sythax 的 foreach ,它是由foreach($iterator as $key=>$value)您必须提供关键方法实现而组成的。

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

  • 使用$pdo->cursor
  • 创建您自己的名为 $currentKey 的属性,并在每次使用next方法时递增它。
于 2013-02-03T10:02:56.150 回答