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