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逻辑异常
OutOfBoundsExceptionkey越界
OutOfRangeExceptionindex越界
OverflowException溢出
RangeException
RuntimeException运行时异常
UnderflowException对空容器进行操作时发生
UnexpectedValueException值非预期时发生

转载于:https://my.oschina.net/taodf/blog/1817019

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值