php spl 使用场景,PHP标准库介绍(SPL)

PHP标准库介绍(SPL)

PHP的SPL库是用于解决一些常见问题的接口与类的集合。SPL库基本包括数据结构,迭代器,接口,异常,SPL函数,文件处理和其它类及接口。熟练掌握SPL库可以帮助我们写出更为简洁和高效的代码。

数据结构

SPL提供的数据结构包括双向链表、栈、队列、堆、最大堆、最小堆、优先队列、固定数组和对象容器。对应的类为:SplDoublyLinkedList、SplStack、SplQueue、SplHeap、SplMaxHeap、SplMinHeap、SplPriorityQueue、SplFixedArray、SplObjectStorage。下面将以代码的形式依次说明每个类的基础用法。

SplDoublyLinkedList

用数组模拟的双向链表。

$linkedList = new SplDoublyLinkedList();

$data = ["jackie", "tom", "tony", "john"];

for($i=0, $len = count($data); $i < $len; $i++){

// index索引是从0开始,且索引只能为整数

$linkedList->add($i, $data[$i]);

}

$linkedList->push("lily");

foreach ($linkedList as $key=>$value){

echo "key: {$key} => value: {$value}\n";

}

echo "elem count: " . $linkedList->count() ."\n";

echo "first elem: " . $linkedList[0] . "\n";

SplStack

使用双向链表模拟栈的特性。

$st = new SplStack();

$data = ["jackie", "tom", "tony", "john"];

foreach ($data as $value){

$st->push($value);

}

echo $st->pop();

SplQueue

使用双向链表模拟队列的特性。

$queue = new SplQueue();

$data = ["jackie", "tom", "tony", "john"];

foreach ($data as $value){

$queue->enqueue($value);

}

echo $queue->dequeue();

SplHeap

堆数据结构,是抽象类,需要实现compare方法。一般用于自定义的数据类型。对于常见的数据类型,可以使用SplmaxHeap或SplMinHeap。

class MaxHeap extends SplHeap{

//针对标量的最大堆

public function compare($value1, $value2)

{

return ($value1 - $value2);

}

}

$maxHeap = new MaxHeap();

for ($i=0; $i < 100; $i++){

$maxHeap->insert(rand(1, 9999));

}

echo $maxHeap->top();

$maxHeap->extract();

echo $maxHeap->top();

对于SplMaxHeap和SplMinHeap可参考上述代码。

SplPriorityQueue

使用最大堆实现的优先队列,用法和最大堆一样。

SplFixedArray

固定长度的数组,和一般数组的区别主要就在于该数组的长度是固定的并且仅允许整数作为索引。该数据相对于一般数组而言,性能较好。

// 数组的长度可以在使用中动态改变。

$arr = new SplFixedArray(10);

for($i=0; $i<9; ++$i){

$arr[$i] = rand(1, 999);

}

var_dump($arr);

echo $arr->getSize() . "\n";

echo $arr[2] . "\n";

$arr->setSize(2). "\n";

var_dump($arr);

echo $arr[2]. "\n";

SplObjectStorage

该数据结构可以实现对象的数据的映射,以PHP中数组为比较的话,就是说可以将对象作为索引。

$s = new SplObjectStorage();

$o1 = new StdClass;

$o2 = new StdClass;

$o3 = new StdClass;

$s[$o1] = "data for object 1";

$s[$o2] = array(1,2,3);

if (isset($s[$o2])) {

var_dump($s[$o2]);

}

迭代器

该部分主要提供了各种特性的迭代器,方便日常的开发。由于较多,这里只是列出各个迭代器的功能,不提供相关的代码参考。

迭代器名

功能

AppendIterator

连续遍历多个迭代器

ArrayIterator

数组遍历的迭代器,但可以在迭代时更新数组中元素

CachingIterator

支持在另外一个迭代器中缓存迭代操作

CallbackFilterIterator

支持回调函数的迭代

DirectoryIterator

遍历目录

EmptyIterator

空迭代器

FilesystemIterator

文件系统遍历,可以获取详细信息

FilterIterator

支持过滤操作的迭代器

GlobIterator

遍历一个文件系统,行为类似于glob

InfiniteIterator

自动执行rewind

IteratorIterator

将Traversable转为Interator

LimitIterator

仅遍历子集

MultipleIterator

有序遍历所有迭代器

NoRewindIterator

不能执行rewind

ParentIterator

递归遍历

RecursiveArrayIterator

RecursiveCachingIterator

RecursiveCallbackFilterIterator

RecursiveDirectoryIterator

RecursiveFilterIterator

RecursiveIteratorIterator

RecursiveRegexIterator

RecursiveTreeIterator

RegexIterator

关于迭代器部分,由于时间有限未完全理解所有迭代器的功能,后续将会逐渐完善。

接口

接口部分包括Countable、OuterIterator、RecursiveIterator和SeekableIterator。

异常

异常名

作用

BadFunctionCallException

函数调用错误

BadMethodCallException

回调错误

DomainException

域名错误

InvalidArgumentException

无效的参数

LengthException

长度异常

LogicException

逻辑异常

OutOfBoundsException

key越界

OutOfRangeException

index越界

OverflowException

溢出

RangeException

RuntimeException

运行时异常

UnderflowException

对空容器进行操作时发生

UnexpectedValueException

值非预期时发生

你可能感兴趣的:(php,spl,使用场景)