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
值非预期时发生