关于Iterator函数使用的一些问题

时间:2013-04-20 03:51:06

标签: php

代码来自:http://php.net/manual/en/class.iterator.php(Example#1基本用法)

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

输出是:

string 'myIterator::rewind' (length=18)

string 'myIterator::valid' (length=17)

string 'myIterator::current' (length=19)

string 'myIterator::key' (length=15)

int 0

string 'firstelement' (length=12)

string 'myIterator::next' (length=16)

string 'myIterator::valid' (length=17)

string 'myIterator::current' (length=19)

string 'myIterator::key' (length=15)

int 1

string 'secondelement' (length=13)

string 'myIterator::next' (length=16)

string 'myIterator::valid' (length=17)

string 'myIterator::current' (length=19)

string 'myIterator::key' (length=15)

int 2

string 'lastelement' (length=11)

string 'myIterator::next' (length=16)

string 'myIterator::valid' (length=17)

所以我们可以看到: 1,函数(var_dump(__METHOD__))输出的顺序是:

string 'myIterator::rewind' (length=18)
string 'myIterator::valid' (length=17)
string 'myIterator::current' (length=19)
string 'myIterator::key' (length=15)

第2和第3,函数输出的顺序是: 函数输出的顺序是:

string 'myIterator::next' (length=16)
string 'myIterator::valid' (length=17)
string 'myIterator::current' (length=19)
string 'myIterator::key' (length=15)

4,函数输出的顺序为:

string 'myIterator::next' (length=16)
string 'myIterator::valid' (length=17)

我的问题是:

  1. 有5个函数:rewind();current(); key(); next(); valid();为什么有些函数似乎不会执行?例如,我们在第一个函数输出中看不到myIterator::next。而且rewind()只显示一次。
  2. $ array中有3个值,所以假设foreach只运行3次,但我们可以看到string 'myIterator::valid' (length=17)出现4次,为什么?

1 个答案:

答案 0 :(得分:1)

第一部分是for - 循环的初始化。它调用rewind将光标移动到列表的开头。这也是你没有看到next的原因。

最后一部分执行next但是,for - 循环意识到已到达列表的结尾,因为valid返回了false。因此,valid被调用4次,3次返回true,然后返回false一次。 for - 循环如何知道在哪里停止?