PHP SPL标准库总共有6个接口,如下:
1.Countable 2.OuterIterator 3.RecursiveIterator 4.SeekableIterator 5.SplObserver 6.SplSubject
其中OuterIterator、RecursiveIterator、SeekableIterator都是继承Iterator类的,下面会对每种接口作用和使用进行详细说明。
Coutable接口:
实现Countable接口的对象可用于count()函数计数。
$count->count();
$count->count();
echo count($count); //3
echo count($count); //4
说明:
调用count()函数时,Mycount::count()方法被调用 count()函数的第二个参数将不会产生影响
OuterIterator接口:
{
return parent::current() . 'TEST';
}
}
foreach(new MyOuterIterator(new ArrayIterator(['b','a','c'])) as $key => $value) {
echo "$key->$value".PHP_EOL;
}
/
结果:
0->bTEST
1->aTEST
2->cTEST
/
在实际运用中,OuterIterator极其有用:
RecursiveIterator接口:
用于循环迭代多层结构的数据,RecursiveIterator另外提供了两个方法:RecursiveIterator::getChildren 获取当前元素下子迭代器 RecursiveIterator::hasChildren 判断当前元素下是否有迭代器
$this->_data = $data;
}
public function valid() {
return isset($this->_data[$this->_position]);
}
public function hasChildren() {
return is_array($this->_data[$this->_position]);
}
public function next() {
$this->_position++;
}
public function current() {
return $this->_data[$this->_position];
}
public function getChildren() {
print_r($this->_data[$this->_position]);
}
public function rewind() {
$this->_position = 0;
}
public function key() {
return $this->_position;
}
}
$arr = array(0,1=> array(10,20),2,3 => array(1,2));
$mri = new MyRecursiveIterator($arr);
foreach ($mri as $c => $v) {
if ($mri->hasChildren()) {
echo "$c has children: " .PHP_EOL;
$mri->getChildren();
} else {
echo "$v" .PHP_EOL;
}
}
/
结果:
0
1 has children:
Array
(
[0] => 10
[1] => 20
)
2
3 has children:
Array
(
[0] => 1
[1] => 2
)
/
SeekableIterator接口:
通过seek()方法实现可搜索的迭代器,用于搜索某个位置下的元素。
$this -> position = $position ;
}
public function rewind () {
$this -> position = 0 ;
}
public function current () {
return $this -> array [ $this -> position ];
}
public function key () {
return $this -> position ;
}
public function next () {
++ $this -> position ;
}
public function valid () {
return isset( $this -> array [ $this -> position ]);
}
}
try {
$it = new MySeekableIterator ;
echo $it -> current (),"\n" ;
$it -> seek ( 2 );
echo $it -> current (),"\n" ;
$it -> seek ( 1 );
echo $it -> current (),"\n" ;
$it -> seek ( 10 );
} catch ( OutOfBoundsException $e ) {
echo $e -> getMessage ();
}
/
结果:
first element
third element
second element
invalid seek position ( 10 )
/