class MyIterator implements Iterator
{
private $var = array();
public function __construct($array){
if(is_array($array)){
$this->var = $array;
}
}
public function rewind(){
echo "rewinding/n";
reset($this->var); #reset() 将 array 的内部指针倒回到第一个单元并返回第一个数组单元的值。
}
public function current(){
$var = current($this->var);
/*
每个数组中都有一个内部的指针指向它“当前的”单元,初始指向插入到数组中的第一个单元。
current()函数返回当前被内部指针指向的数组单元的值,并不移动指针。
如果内部指针指向超出了单元列表的末端,curret() 返回 FALSE。
*/
echo "current: $var/n";
return $var;
}
public function key(){
$var = key($this->var);
/*
mixed key ( array array)
key() 返回数组中当前单元的键名。
*/
echo "key: $var/n";
return $var;
}
public function next(){
$var = next($this->var);
/*
mixed next ( array array)
返回数组内部指针指向的下一个单元的值,或当没有更多单元时返回 FALSE。
next()和current()的行为类似,只有一点区别,在返回值之前将内部指针向前移动一位。
这意味着它返回的是下一个数组单元的值并将数组指针向前移动了一位。
如果移动指针的结果是超出了数组单元的末端,则 next() 返回 FALSE。
*/
echo "next: $var/n";
return $var;
}
public function valid(){
$var = $this->current() !== false;
echo "valid: {$var}/n";
return $var;
}
}
$values = array(1, 2, 3);
$it = new MyIterator($values);
foreach($it as $a => $b){
print "$a => $b/n";
}
?>
/* 输出结果如下
rewinding
current: 1
valid: 1
current: 1
key: 0
0 => 1
next: 2
current: 2
valid: 1
current: 2
key: 1
1 => 2
next: 3
current: 3
valid: 1
current: 3
key: 2
2 => 3
next:
current:
valid:
foreach语句遍历Iterator接口的过程如下:
循环之前rewind()方法使迭代器指针指向第一个元素,随后调用valid()方法
在valid()方法调用中current()方法先被调用。接着foreach语句自动调用,
current(),key(), next()
当valid()返回FALSE的时候迭代结束
*/