代码来自: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)
我的问题是:
rewind();current(); key(); next(); valid();
为什么有些函数似乎不会执行?例如,我们在第一个函数输出中看不到myIterator::next
。而且rewind()
只显示一次。string 'myIterator::valid' (length=17)
出现4次,为什么?答案 0 :(得分:1)
第一部分是for
- 循环的初始化。它调用rewind
将光标移动到列表的开头。这也是你没有看到next
的原因。
最后一部分执行next
但是,for
- 循环意识到已到达列表的结尾,因为valid
返回了false
。因此,valid
被调用4次,3次返回true
,然后返回false
一次。 for
- 循环如何知道在哪里停止?