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
类;临时文件;