0

Already I extended and implemented from SPL iterator.
But if I want to use it, I should use it on a foreach.
I tried to use it in a while like this:

$news = new testClass();

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

It will create an infinite loop !
But with foreach, it works fine!

Here is top of my class:

class testClass implements \Iterator

Where is the mistake ?

4

3 に答える 3

1

SPLこのタイプの「標準的な」問題にクラスを使用することに勇気を出してください。経験の浅い/ずさんな開発者 (または単に先のことを考えない優秀な開発者) が、このような状況で車輪を再発明するのをよく見てきました。

インターフェイスの実装に関する非常に重要な詳細が欠落していiteratorます。

詳細については、PHP:Iterator - マニュアルを参照してください。また、以下の参照実装も参照してください。

まず、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 に答える