PHP SPL 标准库

小白兔晒黑了 / 2024-09-01 / 原文

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