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

猜你喜欢

转载自my.oschina.net/taodf/blog/1817019