简单来说,PHP的iterator,就是扩展了foreach循环对象的功能。你可以在循环对象时,自定义一些属性和方法,让对象也能像数组一样foreach循环。
<?php
class It implements Iterator {
private $offset;
private $array = [
'first val',
'second val',
'third val'
];
public function __construct() {
$this->offset = 0;
}
/**
* 第一次循环时的第一步,调用此方法,设置offset为0
* @return [type] [description]
*/
public function rewind() {
var_dump(__METHOD__);
echo "<br />";
$this->offset = 0;
}
/**
* 每次循环的第二步,调用此方法,检查offset是否存在,不存在也就是offset到尽头时,返回FALSE并终止循环
* @return [type] [description]
*/
public function valid() {
var_dump(__METHOD__);
echo "<br />";
return isset($this->array[$this->offset]);
}
/**
* 每次循环的第三步,调用此方法,返回当前offset对应的value
* @return [type] [description]
*/
public function current() {
var_dump(__METHOD__);
echo "<br />";
return $this->array[$this->offset];
}
/**
* 每次循环的第四步,调用此方法,返回当前offset值
* @return [type] [description]
*/
public function key() {
var_dump(__METHOD__);
echo "<br />";
return $this->offset;
}
/**
* 从第二次开始循环开始,每一次循环的第一步,调用此方法,让offset自增
* @return function [description]
*/
public function next() {
var_dump(__METHOD__);
echo "<br />";
++$this->offset;
}
}
$it = new It();
foreach ($it as $key => $value) {
echo $key . ' :' . $value;
echo "<br /><br />";
}
结果如下:
string(10) "It::rewind"
string(9) "It::valid"
string(11) "It::current"
string(7) "It::key"
0 :first val
string(8) "It::next"
string(9) "It::valid"
string(11) "It::current"
string(7) "It::key"
1 :second val
string(8) "It::next"
string(9) "It::valid"
string(11) "It::current"
string(7) "It::key"
2 :third val
string(8) "It::next"
string(9) "It::valid"
网友评论