PHP  SPL是指 standard  php library,php标准库。

SPL提供了一系列的类和接口,使用这些类和接口,我们可以更加高效、优雅的使用php进行程序设计。
 
从php5.0开始,已经支持spl。从5.3开始,SPL已经嵌入PHP内核,无需任何配置
 
php提供了下列的数据结构类:
 
SplDoublyLinkedList  :双向链表 , 实现了 Iterator|ArrayAccess|Countable接口中的方法
SplStack: 栈
SplQueue: 队列
SplHeap :堆
SplMaxHeap:大顶堆
SplMinHeap:小顶堆
SplPriorityQueue:带权队列
SplFixedArray:固定数组
 
 
先学习SplFixedArray,为之后其他的学习打下基础
<?php
/*
* SplFixedArray():用于创建固定长度的数组,只允许整型数作为索引,比普通php数组更快,性能更好
* 它本身实现了Iterator ArrayAccess Countable这几个接口
* 实现了ArrayAccess,那么可以使用foreach遍历
* 实现了Countable,那么可以使用count计算长度
* 实现了Iterator,那么可以向链表一样操作
*/
$arr = new SplFixedArray(5);//创建时指定长度 $arr->setSize(4);//setSize()动态设置数组长度
$arr[0] = 'a';
$arr[1] = 'b';
$arr[2] = 'c';
$arr[3] = 'd'; //遍历,遍历完后指针指向末尾空
foreach ($arr as $v){
echo $v;
echo PHP_EOL;
}
echo "<br/>";
var_dump($arr->valid());//已经移出数组外 //getSize() count()都是获取数组长度
$a = $arr->getSize();
echo $a;//4
echo "<br/>"; echo $arr->count();//实现了Countable接口的方法,4
echo "<br/>"; $a = count($arr);//数组实现了Countable,php数组提供的count方法也可用
echo $a;//4
echo "<br/>"; //实现Iterator中的方法 /*
* 移动指针方法: rewind(),next(),都只移动指针,无返回值,是一个动作
* 取键值的方法: key(),current() 返回当前指针指向的index 和element
* 检查指针方法: valid() 检查当前指针是否超出数组范围,返回bool值
*
*/ $arr->rewind();//重置指针,指向开头处,无返回值
$a = $arr->current();//返回当前指针指向的值
var_dump($a);
echo PHP_EOL;
$arr->next();//移动指针,将指针指向下一位,无返回值
$a = $arr->valid();//检测当前指针是否有效,也就是说当前指针是否超出数组范围
var_dump($a);
$a = $arr->current();//返回当前指针指向的值
var_dump($a);
echo PHP_EOL;
echo $arr->key();//返回当前指针指向的key
$arr->next();
$arr->next();
$arr->next();//移出了数组范围,
var_dump($arr->valid());//检测返回false /*======================================
*
* offsetget(index) = $arr[$index]//获取索引对应的元素值
* offserget(index,element) = ($arr[$index]=$element)//修改index对应的element
* offsetUnset(index) = unset($arr[$index])//释放index对应的element
* offsetExists(index) = isset($arr[$index])//判断index是否存在
*
*=======================================*/
$a = $arr->offsetGet(3); // 相当于 $arr[3]
var_dump($a);//d
echo $arr[3];//d
echo PHP_EOL; $arr->offsetSet(3,'e');//相当于$arr[3] = 'e';
echo $arr[3];
$arr[3] = 'd';
echo PHP_EOL;
echo $arr[3]; $arr->offsetUnset(3);//相当于unset($arr[3]);
var_dump($arr[3]);//null $m = $arr->offsetExists(3);//相当于isset($arr[3])
var_dump($m); /*=======SplFixedArray()与PHP数组的转化函数====== 方法 fromAaary() : 将一个PHP普通数组转化成SPL数组,静态方法SplFixedArray::fromArray(),
方法 toArray() :将一个SPL数组转化成PHP普通数组 ,无参数,返回PHP普通数组 =============================================*/ $arr = $arr->toArray();
var_dump($arr);//返回普通php数组 $arr = array(1=>3,0=>1,4=>2);//普通PHP数组
$arr = SplFixedArray::fromArray($arr);//第二个参数是默认true,表示保持原来的索引关系。false表示舍弃原来的索引
var_dump($arr);//返回SPL数组 $arr = array(1=>3,0=>1,4=>2);//普通PHP数组
$arr = SplFixedArray::fromArray($arr,false);//舍弃原来的索引关系
var_dump($arr);//返回SPL数组 ?>

  接下来是双向链表

<?php
/**
* SPL双向队列SplDoublyLinkedList(),实现了Iterator , ArrayAccess , Countable接口
*/ $linklist = new SplDoublyLinkedList(); $linklist->push('a');//插入元素
$linklist->push('b');
$linklist->push('c');
$linklist->push('d'); var_dump($linklist->getIteratorMode()); /*
* Iterator 系列方法
*/
$linklist->rewind();//指针指向开头,动作,无返回值
$linklist->next();//移动指针,动作,无返回值
var_dump($linklist->key());//返回当前指针指向的index
var_dump($linklist->current());//返回当前指针指向的element
var_dump($linklist->valid());//检测指针是否移出链表 //补充
$linklist->prev();//指针向前移动,对应next向后
var_dump($linklist->current()); /*
* ArrayAccess 系列方法
*/
//offSetGet offsetSet offsetExists offsetUnset 和SplFixedArray的一样,按照数组方式的几个操作
foreach ($linklist as $value){//可以像foreach遍历
echo $value;
echo PHP_EOL;
} var_dump($linklist[0]);//以数组方式取值
echo count($linklist);//4,数组方式
echo PHP_EOL; /*
* Countable()方法
*/
echo $linklist->count();//4 /*
* 自身特有方法
*/ $linklist->rewind();//指针指向底部,这个函数要常用 //add()方法在5.5.0以上的版本才存在,将一个值插入链表某个位置,和原来的值形成链表,也就是这个节点的多个值链接成一个链表
//serialize()/unserialize()两个函数在5.4.0以上的版本中才能使用,序列化和反序列化使用 var_dump($linklist->isEmpty());//判断是否为空
$linklist->push('e');//往顶部插入元素
$linklist->unshift('A');//往底部插入元素 var_dump($linklist->top());//返回顶部元素,后插入的在顶部
var_dump($linklist->bottom());//返回底部元素,先插入的在底部 var_dump($linklist->pop());//弹出顶部元素
var_dump($linklist->shift());//弹出底部元素 $linklist->setIteratorMode(SplDoublyLinkedList::IT_MODE_DELETE);//这两个是一对,暂不清楚具体怎么用的
var_dump($linklist->getIteratorMode()); ?>

  

SPL 笔记的更多相关文章

  1. PHP标准库 (SPL) 笔记

    简介 SPL是Standard PHP Library(PHP标准库)的缩写. The Standard PHP Library (SPL) is a collection of interfaces ...

  2. 【夯实PHP基础】PHP标准库 SPL

    PHP SPL笔记 这几天,我在学习PHP语言中的SPL. 这个东西应该属于PHP中的高级内容,看上去很复杂,但是非常有用,所以我做了长篇笔记.不然记不住,以后要用的时候,还是要从头学起. 由于这是供 ...

  3. PHP 错误与异常 笔记与总结(12 )异常

    ① 异常的概念:异常和错误的区别 PHP 部分借鉴了 C++ 和 JAVA 中的异常处理机制.PHP 中的异常是指 程序运行和预期不太一致,与错误是两个不同的概念. ② 异常的语法结构 [例1] &l ...

  4. PHP高级编程SPL

    这几天,我在学习PHP语言中的SPL. 这个东西应该属于PHP中的高级内容,看上去非常复杂,可是非常实用,所以我做了长篇笔记.不然记不住,以后要用的时候,还是要从头学起. 因为这是供自己參考的笔记,不 ...

  5. PHP标准库 SPL

    PHP SPL笔记 这几天,我在学习PHP语言中的SPL. 这个东西应该属于PHP中的高级内容,看上去很复杂,但是非常有用,所以我做了长篇笔记.不然记不住,以后要用的时候,还是要从头学起. 由于这是供 ...

  6. php spl库的使用(PHP标准库)【摘抄引用】

    文章来源与推荐阅读:阮一峰--PHP SPL笔记  &&  PHP SPL使用方法和他的威力 1.SPL 是什么? SPL:standard php library php标准库,此 ...

  7. PHP 设计模式 笔记与总结(3)SPL 标准库

    SPL 库的使用(PHP 标准库) 1. SplStack,SplQueue,SplHeap,SplFixedArray 等数据结构类 ① 栈(SplStack)(先进后出的数据结构) index.p ...

  8. php学习笔记2016.1

    基本类型    PHP是一种弱类型语言.      PHP类型检查函数   is_bool()    is_integer()  is_double()  is_string()   is_objec ...

  9. SPL学习 迭代器

    主要学习内容: 慕课网的spl视频教程 阮一峰SPL学习笔记 http://www.ruanyifeng.com/blog/2008/07/php_spl_notes.html SPL类详解 http ...

随机推荐

  1. 常用工具说明--Java的常用工具

    1.Eclipse.IntelliJ IDEA Eclipse是IDE领域的瑞士军刀,有着大量定制的接口和无数的插件.它无处不在,后面本文将推荐的其他所有工具都提供Eclipse插件. Eclipse ...

  2. 19.Decorator修饰器

    Decorator 修饰器 类的修饰 许多面向对象的语言都有修饰器(Decorator)函数,用来修改类的行为.目前,有一个提案将这项功能,引入了 ECMAScript. @testable clas ...

  3. 撩课-Web大前端每天5道面试题-Day22

    1.mvvm和mvc区别?它和其它框架(jquery)的区别是什么?哪些场景适合? mvc和mvvm其实区别并不大. 都是一种设计思想. 主要就是mvc中Controller演变成mvvm中的view ...

  4. Java注解(二)

    前面了解了注解的基本内容,这次来看一下自定义注解. 自定义注解其实很简单,直接上代码: import java.lang.annotation.Documented; import java.lang ...

  5. Myeclipse默认编码设置

    Myeclipse默认编码设置 由于编码问题的出现,我们就必须明确自己在Myeclipse所写的各种文件是按照什么格式来进行编码的.所以只有知己知彼,才能bug少出. 对于刚接触MyEclipse的不 ...

  6. 计算机网络:自顶向下方法(第七版)Wireshark实验指南

    这本书的每一章后面都提供了一个Wireshark实验,通过使用Wireshark抓包并手动对包进行分析可以帮助我们更好地理解各种协议和相关知识.然而,这个资源在网上好像很难找,我历经千辛万苦找到之后, ...

  7. 悟空模式-java-普通工厂模式

    [大圣看玩多时,问土地道:“此树有多少株数?”土地道:“有三千六百株.前面一千二百株,花微果小,三千年一熟,人吃了成仙了道,体健身轻.中间一千二百株,层花甘实,六千年一熟,人吃了霞举飞升,长生不老.后 ...

  8. MVC,MVP 和 MVVM 的图示(转)

    作者: 阮一峰 日期: 2015年2月 1日 转自:http://www.ruanyifeng.com/blog/2015/02/mvcmvp_mvvm.html 复杂的软件必须有清晰合理的架构,否则 ...

  9. java运算符优先级别

    算数-->关系-->逻辑-->赋值

  10. 关于vue2用vue-cli搭建环境后域名代理的http-proxy-middleware解决api接口跨域问题

    在vue中用http-proxy-middleware来进行接口代理,比如:本地运行环境为http://localhost:8080但真实访问的api为 http://www.baidu.com这时我 ...