SPL學習之SplDoublyLinkedList
Standard PHP Library(SPL)是官方提供的标准库,从php5.0.0开始已经默认实现在php中,我们可以类比它为ruby中的gem安装的包。spl里面实现了许多迭代器和数据结构对象接口,非常实用和高效。下面是我的学习记录:
从php5.0.0之后才默认可用,而在php5.3.0开始这个扩展将一直开启,且不在php.ini内配置。
根据php.net/spl 相关文档描述,spl分为以下7种大类:
1.Datastructures数据结构对象。
2.Iterators迭代器。
3.interfaces接口。
4.Exceptions异常。
5.SPL Functions标准函数。
6.File Handling文件资源句柄。
7.Miscellaneous Classes and Interfaces多元类和接口。
下面我依次总结:
1.Datastructures
数据结构一直都是编程的主力。以前我们所说的堆、栈、队列,链表,树等。程序=数据结构+算法,已经成了大部分的人共识,在处理一些特定问题,选择适当的数据结构能够事半功倍。
1.The SplDoublyLinkedList class (双向链表)
双向链表也叫双链表,是链表的一种,它的每个数据结点中都有两个指针,分别指向直接后继和直接前驱。所以,从双向链表中的任意一个结点开始,都可以很方便地访问它的前驱结点和后继结点。一般我们都构造双向循环链表。(by wiki description)
funlist can see:
http://php.net/manual/zh/class.spldoublylinkedlist.php
// init an object of double Link list
$dlist = new SplDoublyLinkedList();
// insert item to the end of the list
$dlist->push("Linker");
$dlist->push("Joker");
$dlist->push("forker");
$dlist->push("worker");
// use unshift can insert an object at top of the list
$dlist->unshift('FreePHP');
// pop an object from the bottom of the list
$dlist->pop();
// delete an object from the top of the list
$dlist->shift();
關於遍歷的方式需要用到
public void SplDoublyLinkedList::setIteratorMode ( int $mode
) 方法
實現迭代器功能的選項有兩種參數,如下:
SplDoublyLinkedList::IT_MODE_LIFO
(Stack style)SplDoublyLinkedList::IT_MODE_FIFO
(Queue style)
eg:
$dlist->setIteratorMode(SplDoublyLinkedList::IT_MODE_LIFO); // use Stack style
for($dlist->rewind();$dlist->valid();$dlist->next()){
echo $dlist->current()."<br/>";;
}
spl中有很多實現迭代器模式的經典例子,此爲其一。在數據庫操作中和數據迭代裏面非常常用。
同样双向链表可以对数据进行序列化和反序列化。
序列化:
$ser = $dlist->serialize();
var_dump($ser);
// out like this : string(45) "i:2;:s:6:"Linker";:s:5:"Joker";:s:6:"forker";"
反序列为unserilalize()方法。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通