手机版

PHP标准库详解(PHP SPL)

时间:2021-08-26 来源:互联网 编辑:宝哥软件园 浏览:

什么是SPL?

PHP标准库SPL,是从PHP 5.0内置的组件和接口,从PHP5.3逐渐成熟,SPL其实是内置在所有的PHP 5开发环境中,没有任何设置。

似乎很多PHP开发人员几乎没有使用过,甚至没有听说过。原因可以追溯到它的描述文档,这让你忽略了“它的存在”。SPL号就像泰坦尼克号的“在海的中心”,沉入海底。现在,它应该被我们捡起来,放在它应有的位置上,这也是本文所表达的观点。

那么,SPL提供了什么?

SPL扩展了PHP引擎,如数组访问、可计数和可查找操作符,用于操作数组形式的对象。同时,还可以使用RecursiveIterator、ArrayObejcts等迭代器来迭代数据。

它还有几个内置的对象,如Exceptions、SplObserver、Spltorage,以及助手函数,如splautoloadregister、splclasses、iteratorapply等。用于重载相应的函数。

总的来说,这些工具就像一把多功能的瑞士军刀,利用好它们可以定性地提高PHP的代码效率。那么,我们如何发挥它的力量呢?

如何使用SPL?

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

双向链表

SplDoublyLinkedList

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

phpsl中的SplDoublyLinkedList类提供了双链表的操作。

SplDoublyLinkedList类总结如下:

SplDoublyLinkedList实现迭代器,arrayaccession,Countable { public _ _ construct(void)public void add(mixed $ index, Mixed $newval) //双链表公共混合顶的头节点(void) //双链表公共混合底的尾节点(void) //双表元素个数公共int count (void) //检查双链表是否为空公共boolsimpty(void) //当前节点索引公共混合键(void)//移到上一条记录公共void prev (void) //移到下一条记录公共void next (void) //当前记录为公共混合当前(void) //迭代开始时将指针指向公共void rewind(void)//检查双链表中是否有节点公共bool有效(void)//指定索引处的节点是否有公共bool偏移量存在(mixed $ index)//获取指定索引处的节点值公共混合偏移量get (mixed $ index)//设置值公共void offsetset (mixed $ index, Mixed $newval) //删除指定索引处的节点public void offset unset(mixed $ index)//从双链表尾部弹出元素public mixed pop(void)//将元素添加到双链表尾部public void push (mixed $value) //序列化存储公共字符串serialize (void) //反序列化公共void unserialize(字符串$ serialized)//设置迭代模式public void setiteratormode(int $ mode)//获取迭代模式spldobellinkdlist :3360 it _ mode _ LIFO(堆栈样式)spldobellinkdlist : it _ mode _ FIFO(队列样式)public int getiterator模式(void)//从双链表头移除元素public mixed shift(void)//从双链表头添加元素public void unshit(mixed $ value)}使用起来也比较简单

$ list=new SplDoubleLinkedList();$ list-push(' a ');$ list-push(' b ');$ list-push(' c ');$ list-push(' d ');$ list-unshift(' top ');$ list-shift();$ list-rewind();//倒带操作用于将节点指针指向节点echo‘currennode 3360’。$ list-当前()。br/';//获取当前节点$ list-next();//指针指向下一个节点回应‘下一个节点:’。$ list-当前()。br/';$ list-next();$ list-next();$ list-prev();//指针指向前一个节点回显“下一个节点:”。$ list-当前()。br/';if($list-current()) echo“当前节点是valid br/”;else echo“当前节点无效br /”;If($list-valid())//如果当前节点是有效节点,valid返回true echo ' valid listbr/';else echo“无效列表br/”;var_dump(array('pop'=$list-pop(),' count'=$list-count(),' isEmpty'=$list-isEmpty(),' bottom'=$list-bottom(),' top '=$ list-top())));$ list-setIteratorMode(spldobellinkdlist : it _ MODE _ FIFO);var _ dump($ list-getIteratorMode());for($ list-rewind();$ list-valid();$ list-next()){ echo $ list-current()。PHP _ EOL} var _ dump($ a=$ list-serialize());//print _ r($ list-unserialize($ a));$list-offsetSet(0,‘new one’);$ list-offsetUnset(0);var_dump(数组(' offset exists '=$ list-offset exists(4),' offsetGet'=$list-offsetGet(0),));var _ dump($ list);//stack,先进先出$ stack=new SplStack();//继承自SplDoublyLinkedList类$ stack-push(' ABR/');$ stack-push(' BBR/');echo $ stack-pop();echo $ stack-pop();echo $stack-offsetSet(0,' B ');//堆栈的offset=0为Top位置,offset=1为Top位置节点靠近底部位置的相邻节点,以此类推$ stack-rewind();//双链表的倒带与栈的倒带相反。堆栈的倒带使当前指针指向顶部位置,而双链表调用底部位置回显“current3360”。$ stack-当前()。br/';$ stack-next();//堆栈的下一个操作使指针指向底部附近的下一个节点,而双链表则是顶部echo‘current 3360’附近的下一个节点。$ stack-当前()。br/';echo ' br/br/';//队列,FIFO $ queue=new SplQueue();//从SplDoublyLinkedList类$queue-enqueue('abr/')继承;//将节点插入队列中的Top位置$ queue-enqueue(' BBR/');$queue-offsetSet(0,“A”);//堆栈的offset=0为Top位置,offset=1为Top位置节点靠近底部位置的相邻节点,以此类推echo $ queue-queue();echo $ queue-queue();echo ' br/br/';过载自动装载机

如果你是“教科书式程序员”,你保证知道如何使用__autoload而不是includes/requires操作来懒洋洋地加载相应的类,对吗?

但是随着时间的推移,你会发现你有麻烦了。首先,您必须确保您的类文件必须在指定的文件路径中。比如在Zend框架中,必须用“_”来划分类名和方法名(如何解决这个问题?)。

另一个问题是,随着项目变得越来越复杂,__autoload中的逻辑也会相应变得复杂。最后,您甚至会添加异常判断,并将加载类的所有逻辑都写入其中。

大家都知道“鸡蛋不能放在一个篮子里”,SPL可以把__autoload的加载逻辑分开。只需编写自己的自动加载功能,并使用SPL提供的功能重新加载。

比如对于上面提到的Zend框架,可以重载Zend loader对应的方法。如果它没有找到相应的类,那么就使用您之前定义的函数。

?PHP类my loader { public static function do autoload($ class){//此模块对应的autoload操作} } spl _ autoload _ register(array(' my loader ',' do autoload '));如您所见,spl自动加载寄存器还可以以数组的形式添加多个加载逻辑。同时,您还可以使用spl自动加载取消注册来删除不再需要的加载逻辑,该逻辑将一直使用。

迭代程序

迭代是常见的设计模式之一,广泛应用于数据集的统一遍历操作。毫不夸张地说,SPL提供了相应数据类型所需的所有迭代器。

一个很好的例子是遍历目录。一般的做法是使用scandir,然后跳过" "和“.”以及其他不符合条件的文件。比如需要遍历一个目录提取图片文件,就需要判断是jpg结尾还是gif结尾。

下面的代码是一个使用SPL迭代器执行上述递归以在指定目录中找到图片文件的例子:

?Php类recursifilefilterator扩展filter iterator {//扩展受保护的$ext=数组(' jpg ',' gif ')满足条件;/* * *提供$path并生成相应的目录迭代器*/public function _ _ construct($ path){ parent :3360 _ _ construct(新递归迭代器(新递归目录运算符($ path)));}/* * *检查文件扩展名是否满足条件*/public function accept(){ $ item=$ this-getineritator();if($ item-isFIle())in _ array(path info($ item-getFilename()、path info _ ext)、$ this-ext(){ return TRUe;} } }//实例化foreach(新recursifefilterator('/path/to/某物')为$ item){ echo $ item.php _ eol;}?你可能会说,做同样的事情不需要更多的代码吗?然后,看看上面的代码,你不是有高度可重用和可测试的代码吗?)

以下是SPL提供的其他迭代器:

RecursiveIterator RecursiveIterator outiterator Iterator FilterIterator recursifefilteriterator ParentIterator seekable Iterator Limit Iterator GlobIterator CachingIterator recursiveaccingiterator NoRewindIterator AppendIterator RecursiveIterator InfiniteIterator regexister递归再生器空迭代器递归树迭代器ArrayIterator自PHP5.3以来,内置了更多的迭代器。我想你可以试试。也许它可以改变你写传统代码的习惯。

定长数组

SPL还内置了一系列数组操作工具。例如,SplFixedArray可用于实例化固定长度的数组。那为什么要用呢?因为比较快,甚至和你的工资问题有关。

我们知道PHP正则数组包含不同类型的键,比如数字、字符串等。其长度是可变的。正是因为有了这些“高级函数”,PHP才会通过键对相应的值进行散列——事实上,这在某些情况下会导致性能问题。

并且SplFixedArray不使用哈希存储,因为它使用固定的数字键。不完全是,你甚至可以把它想象成一个C数组。这就是为什么SplFixedArray比普通数组更快(仅在PHP5.3中)。

有多快?下面的分组数据可以让你一窥究竟。

如果需要大量的数组操作,可以尝试一下,相信是值得信赖的。

数据结构

同时,SPL还提供了一些基本类型的数据结构。虽然我们可以使用传统的变量类型来描述数据结构,例如,使用数组来描述Strack) -然后使用相应的方法pop和push(arrayop()、arraypush()),但您必须始终小心,因为毕竟它们不是专门用于描述数据结构的-一次误操作可能会破坏堆栈。

spl的SPLstack对象严格以栈的形式描述数据,并提供相应的方法。同时这样的代码应该能够理解它是在操作栈而不是数组,这样你的同伴才能更好的理解对应的代码,而且速度更快。

最后,也许上面提到的苍白的例子不足以“诱惑你”使用SPL。实践带来真知,SPL越来越强大的功能需要自己去探索。只有像宝石一样慢慢雕刻,它才能发光。

摘要

以上就是本文的全部内容。希望本文的内容对大家的学习或工作有一定的参考价值。谢谢你的支持。如果你想了解更多,请查看下面的相关链接

版权声明:PHP标准库详解(PHP SPL)是由宝哥软件园云端程序自动收集整理而来。如果本文侵犯了你的权益,请联系本站底部QQ或者邮箱删除。

相关文章推荐