0

0

PHP的标准库

不言

不言

发布时间:2018-04-28 11:49:40

|

3454人浏览过

|

来源于php中文网

原创

这篇文章主要介绍了关于php的标准库 ,有着一定的参考价值,现在分享给大家,有需要的朋友可以参考一下

转:https://www.cnblogs.com/yafang/p/5872187.html 

一.什么是SPL?

    SPL是用于解决典型问题(standard problems)的一组接口与类的集合。(出自:http://php.net/manual/zh/intro.spl.php)

    SPL,PHP 标准库(Standard PHP Library) ,从 PHP 5.0 起内置的组件和接口,且从 PHP5.3 已逐渐的成熟。SPL 在所有的 PHP5 开发环境中被内置,同时无需任何设置。

  二.如何使用?

    SPL提供了一组标准数据结构:

    双向链表

    • SplStack

    • SplQueue

    • SplDoublyLinkedList

    双链表是一种重要的线性存储结构,对于双链表中的每个节点,不仅仅存储自己的信息,还要保存前驱和后继节点的地址。

    PHP SPL中的SplDoublyLinkedList类提供了对双链表的操作。

    SplDoublyLinkedList类摘要如下:


复制代码

 1 SplDoublyLinkedList implements Iterator  , ArrayAccess  , Countable  { 
 2    
 3   public __construct ( void ) 
 4   public void add ( mixed $index , mixed $newval ) 
 5   //双链表的头部节点 
 6   public mixed top ( void ) 
 7   //双链表的尾部节点 
 8   public mixed bottom ( void ) 
 9   //双联表元素的个数
 10   public int count ( void )
 11   //检测双链表是否为空
 12   public bool isEmpty ( void )
 13   
 14   
 15   //当前节点索引
 16   public mixed key ( void )
 17   //移到上条记录
 18   public void prev ( void )
 19   //移到下条记录
 20   public void next ( void )
 21   //当前记录
 22   public mixed current ( void )
 23   //将指针指向迭代开始处
 24   public void rewind ( void )
 25   //检查双链表是否还有节点
 26   public bool valid ( void )
 27   
 28   //指定index处节点是否存在
 29   public bool offsetExists ( mixed $index )
 30   //获取指定index处节点值
 31   public mixed offsetGet ( mixed $index )
 32   //设置指定index处值
 33   public void offsetSet ( mixed $index , mixed $newval )
 34   //删除指定index处节点
 35   public void offsetUnset ( mixed $index )
 36   
 37   //从双链表的尾部弹出元素
 38   public mixed pop ( void )
 39   //添加元素到双链表的尾部
 40   public void push ( mixed $value )
 41   
 42   //序列化存储
 43   public string serialize ( void )
 44   //反序列化
 45   public void unserialize ( string $serialized )
 46   
 47   //设置迭代模式
 48   public void setIteratorMode ( int $mode )
 49   //获取迭代模式SplDoublyLinkedList::IT_MODE_LIFO (Stack style) SplDoublyLinkedList::IT_MODE_FIFO (Queue style)
 50   public int getIteratorMode ( void )
 51   
 52   //双链表的头部移除元素
 53   public mixed shift ( void )
 54   //双链表的头部添加元素
 55   public void unshift ( mixed $value )
 56   
 57 }

复制代码

     

    使用起来也比较简单


复制代码

1 $list = new SplDoublyLinkedList(); 
2 $list->push('a'); 
3 $list->push('b'); 
4 $list->push('c');
5 $list->push('d'); 
6  
7 $list->unshift('top'); 
8 $list->shift(); 
9 
10 $list->rewind();//rewind操作用于把节点指针指向Bottom所在的节点
11 echo 'curren node:'.$list->current()."<br />";//获取当前节点
12 
13 $list->next();//指针指向下一个节点
14 echo 'next node:'.$list->current()."<br />";
15 
16 $list->next();
17 $list->next();
18 $list->prev();//指针指向上一个节点
19 echo 'next node:'.$list->current()."<br />";
20 
21 if($list->current())
22     echo 'current node is valid<br />';
23 else
24     echo 'current node is invalid<br />';
25 
26 
27 if($list->valid())//如果当前节点是有效节点,valid返回true
28     echo "valid list<br />";
29 else
30     echo "invalid list <br />";
31 
32 
33 var_dump(array(
34     'pop' => $list->pop(),
35     'count' => $list->count(),
36     'isEmpty' => $list->isEmpty(),
37     'bottom' => $list->bottom(),
38     'top' => $list->top()
39 )); 
40 
41 $list->setIteratorMode(SplDoublyLinkedList::IT_MODE_FIFO);
42 var_dump($list->getIteratorMode());
43 
44 for($list->rewind(); $list->valid(); $list->next()) {
45     echo $list->current().PHP_EOL;
46 }
47 
48 var_dump($a = $list->serialize());
49 //print_r($list->unserialize($a));
50 
51 $list->offsetSet(0,'new one');
52 $list->offsetUnset(0);
53 var_dump(array(
54     'offsetExists' => $list->offsetExists(4),
55     'offsetGet' => $list->offsetGet(0),
56 
57 ));
58 var_dump($list);
59 
60 //堆栈,先进后出
61 $stack = new SplStack();//继承自SplDoublyLinkedList类
62 
63 $stack->push("a<br />");
64 $stack->push("b<br />");
65 
66 echo $stack->pop();
67 echo $stack->pop();
68 echo $stack->offsetSet(0,'B');//堆栈的offset=0是Top所在的位置,offset=1是Top位置节点靠近bottom位置的相邻节点,以此类推
69 $stack->rewind();//双向链表的rewind和堆栈的rewind相反,堆栈的rewind使得当前指针指向Top所在的位置,而双向链表调用之后指向bottom所在位置70 echo 'current:'.$stack->current().'<br />';
71 
72 $stack->next();//堆栈的next操作使指针指向靠近bottom位置的下一个节点,而双向链表是靠近top的下一个节点
73 echo 'current:'.$stack->current().'<br />';
74 echo '<br /><br />';
75 
76 //队列,先进先出
77 $queue = new SplQueue();//继承自SplDoublyLinkedList类
78 
79 $queue->enqueue("a<br />");//插入一个节点到队列里面的Top位置
80 $queue->enqueue("b<br />");
81 
82 $queue->offsetSet(0,'A');//堆栈的offset=0是Top所在的位置,offset=1是Top位置节点靠近bottom位置的相邻节点,以此类推
83 
84 echo $queue->dequeue();
85 echo $queue->dequeue();
86 
87 echo "<br /><br />";

复制代码

    堆

    堆(Heap)就是为了实现优先队列而设计的一种数据结构,它是通过构造二叉堆(二叉树的一种)实现。根节点最大的堆叫做最大堆或大根堆(SplMaxHeap),根节点最小的堆叫做最小堆或小根堆(SplMinHeap)。二叉堆还常用于排序(堆排序)。

    SplHeap类摘要如下:

复制代码

1 abstract SplHeap implements Iterator , Countable {
2   /* 方法 */ 
3   public __construct ( void ) 
4   abstract protected int compare ( mixed $value1 , mixed $value2 ) 
5   public int count ( void ) 
6   public mixed current ( void ) 
7   public mixed extract ( void ) 
8   public void insert ( mixed $value ) 
9   public bool isEmpty ( void )
10   public mixed key ( void )
11   public void next ( void )
12   public void recoverFromCorruption ( void )
13   public void rewind ( void )
14   public mixed top ( void )
15   public bool valid ( void )
16 }

复制代码

    显然它是一个抽象类,最大堆(SplMaxHeap)和最小堆(SplMinHeap)就是继承它实现的。最大堆和最小堆并没有额外的方法。

SplHeap简单使用:

复制代码

1 //堆 
2 class MySplHeap extends SplHeap{ 
3     //compare()方法用来比较两个元素的大小,绝对他们在堆中的位置 
4     public function compare( $value1, $value2 ) { 
5         return ( $value1 - $value2 ); 
6     } 
7 } 
8  
9 $obj = new MySplHeap();
10 
11 $obj->insert(0);
12 $obj->insert(1);
13 $obj->insert(2);
14 $obj->insert(3);
15 $obj->insert(4);
16 
17 echo $obj->top();//4
18 echo $obj->count();//5
19 
20 foreach ($obj as $item) {
21     echo $item."<br />";
22 }

复制代码 

    队列

    • SplPriorityQueue

优先队列也是非常实用的一种数据结构,可以通过加权对值进行排序,由于排序在php内部实现,业务代码中将精简不少而且更高效。通过SplPriorityQueue::setExtractFlags(int  $flag)设置提取方式可以提取数据(等同最大堆)、优先级、和两者都提取的方式。

    SplPriorityQueue类摘要如下:

复制代码

1 SplPriorityQueue implements Iterator , Countable { 
2   /* 方法 */ 
3   public __construct ( void ) 
4   public int compare ( mixed $priority1 , mixed $priority2 ) 
5   public int count ( void ) 
6   public mixed current ( void ) 
7   public mixed extract ( void ) 
8   public void insert ( mixed $value , mixed $priority ) 
9   public bool isEmpty ( void )
10   public mixed key ( void )
11   public void next ( void )
12   public void recoverFromCorruption ( void )
13   public void rewind ( void )
14   public void setExtractFlags ( int $flags )
15   public mixed top ( void )
16   public bool valid ( void )
17 }

复制代码

    简单使用:

复制代码

1 $pq = new SplPriorityQueue(); 
2  
3 $pq->insert('a', 10); 
4 $pq->insert('b', 1); 
5 $pq->insert('c', 8); 
6  
7 echo $pq->count() .PHP_EOL; //3 
8 echo $pq->current() . PHP_EOL; //a 
9 
10 /**
11  * 设置元素出队模式
12  * SplPriorityQueue::EXTR_DATA 仅提取值
13  * SplPriorityQueue::EXTR_PRIORITY 仅提取优先级
14  * SplPriorityQueue::EXTR_BOTH 提取数组包含值和优先级
15  */
16 $pq->setExtractFlags(SplPriorityQueue::EXTR_DATA);
17 
18 while($pq->valid()) {
19     print_r($pq->current());  //a  c  b
20     $pq->next();
21 }

复制代码

    阵列

    • SplFixedArray

SplFixedArray主要是处理数组相关的主要功能,与普通php array不同的是,它是固定长度的,且以数字为键名的数组,优势就是比普通的数组处理更快。通常情况下SplFixedArray要比php array快上20%~30%,所以如果你是处理巨大数量的固定长度数组,还是强烈建议使用。

SplFixedArray类摘要如下:

复制代码

1 SplFixedArray implements Iterator , ArrayAccess , Countable {
2   /* 方法 */ 
3   public __construct ([ int $size = 0 ] ) 
4   public int count ( void ) 
5   public mixed current ( void ) 
6   public static SplFixedArray fromArray ( array $array [, bool $save_indexes = true ] ) 
7   public int getSize ( void ) 
8   public int key ( void ) 
9   public void next ( void )
10   public bool offsetExists ( int $index )
11   public mixed offsetGet ( int $index )
12   public void offsetSet ( int $index , mixed $newval )
13   public void offsetUnset ( int $index )
14   public void rewind ( void )
15   public int setSize ( int $size )
16   public array toArray ( void )
17   public bool valid ( void )
18   public void __wakeup ( void )
19 }

复制代码

简单使用:

复制代码

1 $arr = new SplFixedArray(4);
2 $arr[0] = 'php'; 
3 $arr[1] = 1; 
4 $arr[3] = 'python'; 
5  
6 //遍历, $arr[2] 为null 
7 foreach($arr as $v) { 
8     echo $v . PHP_EOL; 
9 }
10 
11 //获取数组长度
12 echo $arr->getSize(); //4
13 
14 //增加数组长度
15 $arr->setSize(5);
16 $arr[4] = 'new one';
17 
18 //捕获异常
19 try{
20     echo $arr[10];
21 } catch (RuntimeException $e) {
22     echo $e->getMessage();
23 }

复制代码

    映射

    • SplObjectStorage

用来存储一组对象的,特别是当你需要唯一标识对象的时候。

PHP SPL SplObjectStorage类实现了Countable,Iterator,Serializable,ArrayAccess四个接口。可实现统计、迭代、序列化、数组式访问等功能。

SplObjectStorage类摘要如下:

复制代码

1 SplObjectStorage implements Countable , Iterator , Serializable , ArrayAccess { 
2   /* 方法 */ 
3   public void addAll ( SplObjectStorage $storage ) 
4   public void attach ( object $object [, mixed $data = NULL ] ) 
5   public bool contains ( object $object ) 
6   public int count ( void ) 
7   public object current ( void ) 
8   public void detach ( object $object ) 
9   public string getHash ( object $object )
10   public mixed getInfo ( void )
11   public int key ( void )
12   public void next ( void )
13   public bool offsetExists ( object $object )
14   public mixed offsetGet ( object $object )
15   public void offsetSet ( object $object [, mixed $data = NULL ] )
16   public void offsetUnset ( object $object )
17   public void removeAll ( SplObjectStorage $storage )
18   public void removeAllExcept ( SplObjectStorage $storage )
19   public void rewind ( void )
20   public string serialize ( void )
21   public void setInfo ( mixed $data )
22   public void unserialize ( string $serialized )
23   public bool valid ( void )
24 }

复制代码

    简单使用:

复制代码

1 class A { 
2     public $i; 
3     public function __construct($i) { 
4         $this->i = $i; 
5     } 
6 } 
7   
8 $a1 = new A(1); 
9 $a2 = new A(2);
10 $a3 = new A(3);
11 $a4 = new A(4);
12  
13 $container = new SplObjectStorage();
14  
15 //SplObjectStorage::attach 添加对象到Storage中
16 $container->attach($a1);
17 $container->attach($a2);
18 $container->attach($a3);
19  
20 //SplObjectStorage::detach 将对象从Storage中移除
21 $container->detach($a2);
22  
23 //SplObjectStorage::contains用于检查对象是否存在Storage中
24 var_dump($container->contains($a1)); //true
25 var_dump($container->contains($a4)); //false
26  
27 //遍历
28 $container->rewind();
29 while($container->valid()) {
30     var_dump($container->current());
31     $container->next();
32 }

相关文章

PHP速学教程(入门到精通)
PHP速学教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

php

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
Rust内存安全机制与所有权模型深度实践
Rust内存安全机制与所有权模型深度实践

本专题围绕 Rust 语言核心特性展开,深入讲解所有权机制、借用规则、生命周期管理以及智能指针等关键概念。通过系统级开发案例,分析内存安全保障原理与零成本抽象优势,并结合并发场景讲解 Send 与 Sync 特性实现机制。帮助开发者真正理解 Rust 的设计哲学,掌握在高性能与安全性并重场景中的工程实践能力。

2

2026.03.05

PHP高性能API设计与Laravel服务架构实践
PHP高性能API设计与Laravel服务架构实践

本专题围绕 PHP 在现代 Web 后端开发中的高性能实践展开,重点讲解基于 Laravel 框架构建可扩展 API 服务的核心方法。内容涵盖路由与中间件机制、服务容器与依赖注入、接口版本管理、缓存策略设计以及队列异步处理方案。同时结合高并发场景,深入分析性能瓶颈定位与优化思路,帮助开发者构建稳定、高效、易维护的 PHP 后端服务体系。

56

2026.03.04

AI安装教程大全
AI安装教程大全

2026最全AI工具安装教程专题:包含各版本AI绘图、AI视频、智能办公软件的本地化部署手册。全篇零基础友好,附带最新模型下载地址、一键安装脚本及常见报错修复方案。每日更新,收藏这一篇就够了,让AI安装不再报错!

30

2026.03.04

Swift iOS架构设计与MVVM模式实战
Swift iOS架构设计与MVVM模式实战

本专题聚焦 Swift 在 iOS 应用架构设计中的实践,系统讲解 MVVM 模式的核心思想、数据绑定机制、模块拆分策略以及组件化开发方法。内容涵盖网络层封装、状态管理、依赖注入与性能优化技巧。通过完整项目案例,帮助开发者构建结构清晰、可维护性强的 iOS 应用架构体系。

59

2026.03.03

C++高性能网络编程与Reactor模型实践
C++高性能网络编程与Reactor模型实践

本专题围绕 C++ 在高性能网络服务开发中的应用展开,深入讲解 Socket 编程、多路复用机制、Reactor 模型设计原理以及线程池协作策略。内容涵盖 epoll 实现机制、内存管理优化、连接管理策略与高并发场景下的性能调优方法。通过构建高并发网络服务器实战案例,帮助开发者掌握 C++ 在底层系统与网络通信领域的核心技术。

25

2026.03.03

Golang 测试体系与代码质量保障:工程级可靠性建设
Golang 测试体系与代码质量保障:工程级可靠性建设

Go语言测试体系与代码质量保障聚焦于构建工程级可靠性系统。本专题深入解析Go的测试工具链(如go test)、单元测试、集成测试及端到端测试实践,结合代码覆盖率分析、静态代码扫描(如go vet)和动态分析工具,建立全链路质量监控机制。通过自动化测试框架、持续集成(CI)流水线配置及代码审查规范,实现测试用例管理、缺陷追踪与质量门禁控制,确保代码健壮性与可维护性,为高可靠性工程系统提供质量保障。

79

2026.02.28

Golang 工程化架构设计:可维护与可演进系统构建
Golang 工程化架构设计:可维护与可演进系统构建

Go语言工程化架构设计专注于构建高可维护性、可演进的企业级系统。本专题深入探讨Go项目的目录结构设计、模块划分、依赖管理等核心架构原则,涵盖微服务架构、领域驱动设计(DDD)在Go中的实践应用。通过实战案例解析接口抽象、错误处理、配置管理、日志监控等关键工程化技术,帮助开发者掌握构建稳定、可扩展Go应用的最佳实践方法。

61

2026.02.28

Golang 性能分析与运行时机制:构建高性能程序
Golang 性能分析与运行时机制:构建高性能程序

Go语言以其高效的并发模型和优异的性能表现广泛应用于高并发、高性能场景。其运行时机制包括 Goroutine 调度、内存管理、垃圾回收等方面,深入理解这些机制有助于编写更高效稳定的程序。本专题将系统讲解 Golang 的性能分析工具使用、常见性能瓶颈定位及优化策略,并结合实际案例剖析 Go 程序的运行时行为,帮助开发者掌握构建高性能应用的关键技能。

50

2026.02.28

Golang 并发编程模型与工程实践:从语言特性到系统性能
Golang 并发编程模型与工程实践:从语言特性到系统性能

本专题系统讲解 Golang 并发编程模型,从语言级特性出发,深入理解 goroutine、channel 与调度机制。结合工程实践,分析并发设计模式、性能瓶颈与资源控制策略,帮助将并发能力有效转化为稳定、可扩展的系统性能优势。

47

2026.02.27

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
PHP课程
PHP课程

共137课时 | 13万人学习

JavaScript ES5基础线上课程教学
JavaScript ES5基础线上课程教学

共6课时 | 11.3万人学习

PHP新手语法线上课程教学
PHP新手语法线上课程教学

共13课时 | 1.0万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号