重拾SPL
以前也看过PHP SPL相关东西,但是都只是在遇到问题和项目需要时临时抱佛脚,而且鉴于现在PHP的开发状况,团队里面可以使用SPL的地方真的不多,所以大部分SPL的核心知识也是阅后即焚,今天记录一下方便后期查看
预定义接口(非SPL部分):
- Traversable
检测一个类是否可以使用 foreach 进行遍历的接口。
无法被单独实现的基本抽象接口。相反它必须由 IteratorAggregate 或 Iterator 接口实现。 - Iterator
迭代器接口 使类可以使用foreach
- Serializable
自定义序列化的接口serialize
/unserialize
函数使用 - ArrayAccess
提供像访问数组一样访问对象的能力的接口
SPL接口和类
- Countable
类实现Countable
可被用于count()
函数. - OuterIterator
- RecursiveIterator
- SeekableIterator 可索引迭代访问接口 可指定访问某个索引的数据
- ArrayObject
- SplObserver
- SplSubject
数据结构
一张图可以说明问题,手册地址:http://php.net/manual/zh/spl.datastructures.php
迭代器
AppendIterator
按顺序迭代访问几个不同的迭代器。例如,希望在一次循环中迭代访问两个或者更多的组合。这个迭代器的append方法类似于array_merge()函数来合并数组。
<?php
$pizzas = new ArrayIterator(array('Margarita', 'Siciliana', 'Hawaii'));
$toppings = new ArrayIterator(array('Cheese', 'Anchovies', 'Olives', 'Pineapple', 'Ham'));
$appendIterator = new AppendIterator;
$appendIterator->append($pizzas);
$appendIterator->append($toppings);
foreach ($appendIterator as $key => $item) {
echo $key . ' => ' . $item . PHP_EOL;
}
?>
// 输出
/**
0 => Margarita
1 => Siciliana
2 => Hawaii
0 => Cheese
1 => Anchovies
2 => Olives
3 => Pineapple
4 => Ham
**/