以前也看过PHP SPL相关东西,但是都只是在遇到问题和项目需要时临时抱佛脚,而且鉴于现在PHP的开发状况,团队里面可以使用SPL的地方真的不多,所以大部分SPL的核心知识也是阅后即焚,今天记录一下方便后期查看

预定义接口(非SPL部分):

  1. Traversable
    检测一个类是否可以使用 foreach 进行遍历的接口。
    无法被单独实现的基本抽象接口。相反它必须由 IteratorAggregate 或 Iterator 接口实现。
  2. Iterator
    迭代器接口 使类可以使用foreach
  3. Serializable
    自定义序列化的接口 serialize/unserialize函数使用
  4. ArrayAccess
    提供像访问数组一样访问对象的能力的接口

更多预定义接口

SPL接口和类

  1. Countable
    类实现 Countable 可被用于 count() 函数.
  2. OuterIterator
  3. RecursiveIterator
  4. SeekableIterator 可索引迭代访问接口 可指定访问某个索引的数据
  5. ArrayObject
  6. SplObserver
  7. SplSubject

数据结构

SPL.jpg

一张图可以说明问题,手册地址: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
**/

ArrayIterator

CachingIterator

CallbackFilterIterator

DirectoryIterator

EmptyIterator

FilesystemIterator

FilterIterator

GlobIterator

InfiniteIterator

IteratorIterator

LimitIterator

MultipleIterator

NoRewindIterator

ParentIterator

RecursiveArrayIterator

RecursiveCachingIterator

RecursiveCallbackFilterIterator

RecursiveDirectoryIterator

RecursiveFilterIterator

RecursiveIteratorIterator

RecursiveRegexIterator

RecursiveTreeIterator

RegexIterator