0

SPL我已经从迭代器扩展和实现了。
但是如果我想使用它,我应该在foreach.
我试图while像这样使用它:

$news = new testClass();

while( $row = $news )
    echo $row["name"];

它将创建一个无限循环!
但是对于foreach,它工作正常!

这是我班上的佼佼者:

class testClass implements \Iterator

错误在哪里?

4

3 回答 3

1

拳头,勇敢地使用SPL此类“标准”问题的类。我经常看到缺乏经验/草率的开发人员(甚至是那些根本不提前考虑的优秀开发人员)在这些类型的情况下重新发明轮子。

您缺少有关iterator接口实现的一些非常重要的细节。

有关更多信息,请参阅PHP:Iterator - Manual以及下面的参考实现。

首先,您需要实现rewind, current, key, next, and valid函数。参考实现如下所示:

class myIterator implements Iterator {
    private $position = 0;
    private $array = array(
        "firstelement",
        "secondelement",
        "lastelement",
    );  

    public function __construct() {
        $this->position = 0;
    }

    function rewind() {
        var_dump(__METHOD__);
        $this->position = 0;
    }

    function current() {
        var_dump(__METHOD__);
        return $this->array[$this->position];
    }

    function key() {
        var_dump(__METHOD__);
        return $this->position;
    }

    function next() {
        var_dump(__METHOD__);
        ++$this->position;
    }

    function valid() {
        var_dump(__METHOD__);
        return isset($this->array[$this->position]);
        }
    }
)

遍历该实现的代码如下所示:

$it = new myIterator;

foreach($it as $key => $value) {
    var_dump($key, $value);
    echo "\n";
}
于 2013-02-03T12:59:39.783 回答
1

foreach是遍历所有元素的语言结构。while执行代码块,直到给定条件为真。要使其工作,您必须使用自己的函数来检查有效键并返回当前元素。

于 2013-02-03T13:00:04.930 回答
0

最后我创建了一个简单的例子:

<?php

/**
 * @author Soroush Khosravi
 * @copyright 2013
 */
class _Iterator
{
    private $array;

    public function setArray(array $data)
    {
        $this->array = $data;
    }

    public function reader()
    {
        if (is_null($this->array))
            return false;

        $elem = array_shift($this->array);
        if (count ($this->array) > 0)
            return $elem;
        return false;
    }
}

Class child extends _Iterator
{
    function execute()
    {
        $this->setArray(array(1,2,3,4,5,6));
        return $this;
    }
}
$obj = new child;
$obj = $obj->execute();
while($row = $obj->reader())
    echo $row;

?>
于 2013-02-03T13:38:01.500 回答