一 Iterator
迭代器可以让对象使用foreach 去遍历里面的私有属性,而不必关系对象内部的数据结构
二 IteratorAggregate
IteratorAggregate接口(是用来将Iterator接口要求实现的5个方法委托给其他类(比如ArrayIterator)来实现)
(1) ArrayIterator接口:允许从PHP数组中创建一个迭代器。
(2)当ArrayIterator迭代器和IteratorAggregate类一起使用的时候,直接免去Iterator创建方法的工作,所以在实现IteratorAggregate类中的方法getIterator时候,返回一个ArrayIterator接口就好。
(3) IteratorAggregate的c语言实现代码:定义抽象方法getIterator,所以实现接口的时候,必须定义该方法
(1) ArrayIterator接口:允许从PHP数组中创建一个迭代器。
(2)当ArrayIterator迭代器和IteratorAggregate类一起使用的时候,直接免去Iterator创建方法的工作,所以在实现IteratorAggregate类中的方法getIterator时候,返回一个ArrayIterator接口就好。
(3) IteratorAggregate的c语言实现代码:定义抽象方法getIterator,所以实现接口的时候,必须定义该方法
如果自己不想实现iterator 可以用iteratorAggregate 集合接口来实现
class SPLIterator implements Iterator
{
private $index ;
private $data ;
public function __construct($data){
$this->data = $data;
}
public function rewind(){
$this->index = 0 ;
}
public function next(){
$this->index ++ ;
}
public function current(){
return $this->data[0];
}
public function key(){
return $this->index ;
}
public function valid(){
return isset($this->data[$this->index]);
}
}
/**
* 如果数据比较复杂,可以使用IteratorAggregate,它支持多维数组
* Class MyIterator
*/
class MyIterator implements IteratorAggregate{
private $data =[];
function __construct($data){
$this->data = $data ;
}
/**
* 必须实现下面的方法,因为是实现的接口
* @author
*/
public function getIterator(){
return new ArrayIterator($this->data);
}
}
$data =[
'a' => 1 ,
'b' => 1 ,
'c' => 1 ,
'd' => 1 ,
] ;
$dataSimple =['a' ,'b','c'] ;
$SPLIterator = new SPLIterator($dataSimple);
foreach ($SPLIterator as $key => $val) {
echo $key .'-----' .$val .PHP_EOL ;
}
$Myiterator = new MyIterator($data);
foreach ($Myiterator as $key => $val) {
echo $key .'-----' .$val .PHP_EOL ;
}
(1)iterator 需要自己去实现迭代
(2) IteratorAggreate则不用去关心