php spl标准库总共有6个接口,如下:
1.countable
2.outeriterator
3.recursiveiterator
4.seekableiterator
5.splobserver
6.splsubject
其中outeriterator、recursiveiterator、seekableiterator都是继承iterator类的,下面会对每种接口作用和使用进行详细说明。
coutable接口:
实现countable接口的对象可用于count()函数计数。
复制代码 代码如下:
class mycount implements countable
{
public function count()
{
static $count = 0;
$count++;
return $count;
}
}
$count = new mycount();
$count->count();
$count->count();
echo count($count); //3
echo count($count); //4
说明:
调用count()函数时,mycount::count()方法被调用
count()函数的第二个参数将不会产生影响
outeriterator接口:
自定义或修改迭代过程。
复制代码 代码如下:
//iteratoriterator是outeriterator的一个实现类
class myouteriterator extends iteratoriterator {
public function current()
{
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极其有用:
复制代码 代码如下:
$db = new pdo('mysql:host=localhost;dbname=test', 'root', 'mckee');
$db->query('set names utf8');
$pdostatement = $db->query('select * from test1', pdo::fetch_assoc);
$iterator = new iteratoriterator($pdostatement);
$tenrecordarray = iterator_to_array($iterator);
print_r($tenrecordarray);
recursiveiterator接口:
用于循环迭代多层结构的数据,recursiveiterator另外提供了两个方法:
recursiveiterator::getchildren 获取当前元素下子迭代器
recursiveiterator::haschildren 判断当前元素下是否有迭代器
复制代码 代码如下:
class myrecursiveiterator implements recursiveiterator
{
private $_data;
private $_position = 0;
public function __construct(array $data) {
$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()方法实现可搜索的迭代器,用于搜索某个位置下的元素。
复制代码 代码如下:
