SPL 是用于解决典型问题(standard problems)的一组接口与类的集合。
数据结构
双向链表
双链表 (DLL) 是一个链接到两个方向的节点列表。当底层结构是 DLL 时, 迭代器的操作、对两端的访问、节点的添加或删除都具有 O(1) 的开销。因此, 它为栈和队列提供了一个合适的实现。

- 双向链表的数据结构 SplDoublyLinkedList
堆
最大(最小)堆是一棵每一个节点的键值都不小于(大于)其孩子(如果存在)的键值的树。大顶堆是一棵完全二叉树,同时也是一棵最大树。小顶堆是一棵完全完全二叉树,同时也是一棵最小树。
- 堆数据结构 SplHeap
- 大顶堆 SplMaxHeap
- 小顶堆 SplMinHeap
基于堆继承,特定于队列优先级场景的SplPriorityQueue
数组
数组是以连续方式存储数据的结构, 可通过索引进行访问。不要将它们与 php 数组混淆: php 数组实际上是按照有序的列表实现的。
- 固定大小的数组 SplFixedArray
对象集
SPL 提供了从对象到数据的映射。此映射也可用作对象集。
- 对象集 SplObjectStorage
迭代器
SPL 提供一系列迭代器以遍历不同的对象。
ArrayIterator遍历数组和对象RecursiveArrayIterator可递归遍历数组和对象
EmptyIterator空迭代器IteratorIterator迭代器的装饰器AppendIterator这个迭代器能陆续遍历几个迭代器CachingIterator支持对另一个迭代器的缓存迭代。RecursiveCachingIterator支持对另一个可递归迭代器的递归缓存迭代
FilterIterator过滤元素的迭代器CallbackFilterIterator回调函数过滤元素的迭代器RecursiveCallbackFilterIterator可递归地回调函数过滤元素的迭代器
RecursiveFilterIterator与RecursiveIteratorIterator结合使用,可以进行递归过滤ParentIterator筛选出有子元素的迭代器
RegexIterator正则迭代器RecursiveRegexIterator可递归的正则迭代器
InfiniteIterator无限循环遍历LimitIterator允许遍历一个Iterator的限定子集的元素.NoRewindIterator不可再rewind遍历
MultiplerIterator并列迭代多个迭代器RecursiveIteratorIterator可递归的迭代器RecursiveTreeIterator允许遍历一个递归迭代器来生成一个ASCII图形树。
DirectoryIterator目录迭代器FilesystemIterator对目录迭代器的二次封装GlobIterator遍历一个文件系统行为类似于glob(). 即路径名带*RecursiveDirectoryIterator可递归目录迭代器
接口
Countable
类实现 Countable 可被用于 count() 函数.
1 | Countable { |
OuterIterator
类实现 OuterIterator 可被用于迭代迭代器;
1 | OuterIterator extends Iterator { |
RecursiveIterator
类实现 RecursiveIterator 可被用于递归迭代迭代器;
1 | RecursiveIterator extends Iterator { |
SeekableIterator
可以根据下标搜索
1 | SeekableIterator extends Iterator { |
SplSubject 与 SplObserver
SplSubject 与 SplObserver 一起使用实现观察者模式;
1 | SplSubject { |
异常
LogicException(extends Exception) 应用程序编写有错误时会抛出此异常BadFunctionCallException找不到方法BadMethodCallException找不到函数
DomainException值不符合有效数据域InvalidArgumentException无效参数LengthException长度异常OutOfRangeException请求非法索引(重点在索引index)
RuntimeException(extends Exception) 运程过程中发现的异常OutOfBoundsException键值找不到(重点在key)OverflowException向一个装满元素的容器再添加元素时,报此异常RangeException
程序执行期间,抛出的异常表示范围错误。通常这意味着除了在溢出之外,还有一个算术错误。这是DomainException的运行时版本。UnderflowException在一个空容器执行无效操作,比如移除元素UnexpectedValueException不是预期值异常
SPL 函数
| 函数名 | 描述 |
|---|---|
class_implements |
返回指定的类实现的所有接口 |
class_parents |
返回指定类的父类 |
class_uses |
返回指定类用到的 trait |
iterator_apply |
为迭代器中每个元素调用一个用户自定义函数 |
iterator_count |
计算迭代器中元素的个数 |
iterator_to_array |
将迭代器中的元素拷贝到数组 |
spl_classes |
返回所有可用的 SPL 类 |
spl_object_hash |
返回指定对象的 hash id |
spl_object_id |
为指定对象生成独一无二的 id, 类似于 spl_object_hash |
spl_autoload_functions |
返回所有已注册的 __autoload() 函数 |
spl_autoload_register |
注册给定的函数作为 __autoload 的实现 |
spl_autoload_unregister |
注销已注册的 __autoload() 函数 |
spl_autoload |
__autoload() 函数的默认实现 |
spl_autoload_extensions |
注册并返回 spl_autoload 函数使用的默认文件扩展名。 |
spl_autoload_call |
尝试调用所有已注册的 __autoload() 函数来装载请求类 |
文件处理
SplFileInfo
SplFileInfo 类提供了针对单个文件的高级面向对象接口。
获取文件的基本信息;比如文件名、路径、访问时间、修改时间;
SplFileObject
继承了 SplFileInfo 类,同时实现迭代器相关功能;
可以对文件内容进行迭代读取,和重写,不支持 append 追加 ;
SplTempFileObject
继承了 SplFileObject 类;临时文件;