PHP SPL 标准库
1 SPL标准库简介
SPL (Standard PHP Library)是 PHP 中的标准库,提供了一组用于解决常见问题的接口和类。它包含了一系列的数据结构、算法、迭代器、文件处理、异常处理等组件,使得 PHP 开发者能够更方便地处理各种编程任务。
SPL是用于解决典型问题(standard problems)的一组接口与类的集合。
SPL提供了一组标准数据结构。
但是,目前在使用中,SPL更多地被看作是一种使object(物体)模仿array(数组)行为的interfaces和classes
此扩展只能在php 5.0以后使用,从PHP 5.3.0 不再被关闭,会一直有效.成为php内核组件一部份
2 SPL 提供的主要组件
各组件可以在《php手册》里查到 总目录 :https://www.php.net/manual/zh/book.spl.php
2.1 数据结构:
2.1.1 SplDoublyLinkedList(双向链表)
https://www.php.net/manual/zh/class.spldoublylinkedlist.php
2.1.2 SplStack(栈 先进后出)
https://www.php.net/manual/zh/class.splstack.php
2.1.3 SplQueue(队列)用于实现堆排序。
https://www.php.net/manual/zh/class.splqueue.php
2.1.4 SplHeap(堆)用于实现堆排序。
https://www.php.net/manual/zh/class.splheap.php
2.1.5 SplMaxHeap(最大堆)
https://www.php.net/manual/zh/class.splmaxheap.php
2.1.6 SplMinHeap(最小堆)
https://www.php.net/manual/zh/class.splminheap.php
2.1.7 SplPriorityQueue(堆之优先队列)
https://www.php.net/manual/zh/class.splpriorityqueue.php
2.1.8 SplFixedArray(阵列【数组】)
https://www.php.net/manual/zh/class.splfixedarray.php
2.1.9 SplObjectStorage(映射【对象存储】)
https://www.php.net/manual/zh/class.splobjectstorage.php
2.2 迭代器(Iterators):
迭代器目录:https://www.php.net/manual/zh/spl.iterators.php
2.2.1 Iterator 接口:定义了基本的迭代器方法,如 current(), next(), valid(), rewind()。
https://www.php.net/manual/zh/class.iterator.php
2.2.2 ArrayIterator:用于迭代数组的 迭代器。
允许在迭代数组和对象时删除元素以及更新值或键。
当你想多次遍历相同数组时你需要实例化 ArrayObject,然后让这个实例创建一个 ArrayIterator 实例。 当你想遍历相同数组时多次你需要实例 ArrayObject 并且让这个实例创建一个 ArrayIterator 实例,然后使用 foreach 或者手动调用 getIterator() 方法。
$array = array(1, 2, 3, 4, 5); $iterator = new ArrayIterator($array); foreach ($iterator as $value) { echo $value . " "; } // 输出: 1 2 3 4 5
2.2.3 EmptyIterator :
EmptyIterator 类用于空迭代器。
2.2.4 IteratorIterator:
https://www.php.net/manual/zh/class.iteratoriterator.php
这个迭代器包装器允许将 Traversable((遍历)接口 ) 的任何内容转换为 Iterator。重要的是要了解大多数不实现 Iterators 的类都有原因,因为它们很可能不允许完整的 Iterator 功能集。如果是这样,则应提供技术来防止误用,否则会出现异常或致命错误。
2.2.4 MultipleIterator:
依次迭代所有附加的迭代器
2.2.5 RecursiveIteratorIterator:
可用于迭代递归迭代器。
2.2.6 DirectoryIterator:用于遍历目录的迭代器。
DirectoryIterator 类提供了一个简单的接口,用于查看文档系统目录的内容。
2.3 文件处理:
2.3.1 SplFileObject:对文件进行迭代和操作的对象。
SplFileObject 类为文件提供了一个面向对象接口。
2.3.2 SplFileInfo:提供有关文件信息的对象。
SplFileInfo 类为单个文档的信息提供了一个高级的面向对象的接口。
2.3.3 SplTempFileObject
SplTempFileObject 类为临时文档提供面向对象的接口
2.4 过滤器(Filters):
2.4.1 FilterIterator:用于过滤迭代器中的元素。
这个抽象类的遍历并过滤出不想要的值。这个类应该被实现了迭代过滤器的类继承 FilterIterator::accept() 方法必须被子类实现。
《PHP 过滤数组的方法 array_filter 和 FilterIterator 迭代器》
2.4.2 RecursiveFilterIterator:递归过滤器迭代器。
这个抽象迭代器过滤掉 RecursiveIterator 不需要的值。应扩展此类以实现自定义筛选器。RecursiveFilterIterator::accept() 必须在子类中实现。
2.5 异常处理:
异常目录 https://www.php.net/manual/zh/spl.exceptions.php
2.5.1 Exception:SPL 异常的基类。
https://www.php.net/manual/zh/class.exception.php
Exception是所有用户级异常的基类。
2.5.2 RuntimeException:运行时异常。
如果发生 只能在运行时发现的错误,则引发异常。
2.5.3 LogicException:逻辑异常。
表示进程逻辑中的错误的 Exception。这种异常应该直接导致代码中的修复。
2.6 其他:
SplObserver 和 SplSubject:用于实现观察者模式的接口。
SplFixedArray:固定大小的数组。
3 简单的使用案例
使用 SPL 可以提高代码的可重用性和可读性,同时减少开发者在实现通用功能时的工作量。例如,通过使用 SPL 的迭代器,可以以一种通用的方式处理各种数据结构,而不必担心底层数据结构的具体实现。
以下是一个简单的示例,演示如何使用 SPL 的迭代器遍历数组:
<?php $array = array(1, 2, 3, 4, 5); $iterator = new ArrayIterator($array); foreach ($iterator as $value) { echo $value . " "; } // 输出: 1 2 3 4 5
迭代器会一行一行处理,而不是像数组那样整个将数组加入内存。适合大数组使用
扩展阅读:
SPL 标准库
https://www.kancloud.cn/a173512/php_note/1231218
迭代器“
迭代器提供了一种让我们逐个处理数据元素的方式,而不需要将整个数据集加载到内存中。
https://www.php.cn/faq/579164.html
迭代器
https://blog.51cto.com/zhangyue0503/5713655