PHP迭代器,比如mysql迭代器?

PHP迭代器,比如mysql迭代器?,php,iterator,Php,Iterator,我已经从SPLiterator扩展并实现了它。 但是如果我想使用它,我应该在foreach上使用它 我试着在中使用它,而是这样的: $news = new testClass(); while( $row = $news ) echo $row["name"]; 它将创建一个无限循环 但使用foreach,效果很好 这是我班上的佼佼者: class testClass implements \Iterator 错误在哪里?首先,对于使用SPL类来解决此类“标准”问题,非常好。我经常

我已经从
SPL
iterator扩展并实现了它。
但是如果我想使用它,我应该在
foreach
上使用它
我试着在
中使用它,而
是这样的:

$news = new testClass();

while( $row = $news )
    echo $row["name"];
它将创建一个无限循环
但使用foreach,效果很好

这是我班上的佼佼者:

class testClass implements \Iterator

错误在哪里?

首先,对于使用
SPL
类来解决此类“标准”问题,非常好。我经常看到经验不足/草率的开发人员(甚至是根本没有超前思维的优秀开发人员)在这种情况下重新发明轮子

您缺少了有关
迭代器
接口实现的一些非常重要的细节

有关更多信息,请参阅,以及下面的参考实现

首先,您需要实现、
倒带、当前、按键、下一步和有效的
功能。参考实现如下所示:

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";
}
用于遍历该实现的代码如下所示:

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";
}

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

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

<?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;

?>


使用
while
循环更像是一个C风格的迭代器,而不是您正在考虑的迭代器。您需要实现,然后它应该与foreach循环一起工作。您正在尝试迭代
$news
对象中的公共属性吗?+1!谢谢你的回答。我已经有这种款式了。如果你回到我的问题上来,我说这是我班上最好的!我明白了,但它并没有告诉我你已经实现了必要的功能。那么,您的问题的答案将包含第二段示例代码(使用foreach而不是for)。无需回答您自己的问题。请记住,对于数组中的任何错误值,这都将失败(即尝试将0置于3和4之间),因此最好坚持使用
foreach
@dev-null-allender我不记得我问过
foreach
!我一直在寻找这个形式,现在这是我的答案,我认为这是真的:)我只是说,你可能会对这个构造的一些值有问题,仅此而已。不管你寻找的答案的形式如何,使用foreach是解决这个问题的更好、更不容易出错的方法。在这种情况下,不使用foreach就像使用字符数组而不是字符串。用一个比已经发布的答案更不周全的答案来回答你自己的问题是愚蠢的。感谢所有的评论:x,但我在mysql中使用它,我不认为数组中的任何元素都是false或false的等价物。。。