当前位置: 首页 > 后端技术 > PHP

【SPL标准库专题(一)】SPL简介

时间:2023-03-30 03:02:27 PHP

什么是SPLSPL是StandardPHPLibrary(PHP标准库)的缩写。根据官方定义,它是“Acollectionofinterfacesandclassesthataremeanttosolvestandardproblems”SPL是用于解决典型问题(标准问题)的接口和类的集合。然而,目前在使用中,SPL更多地被视为允许对象模仿数组行为的接口和类。SPL的核心概念是Iterator。在我的理解中,SPL和后面要提到的设计模式话题,都是为了同一个目的:构建优雅、简洁、易于扩展和维护的代码。有时候我们看似写了更多的代码,但实际上这使得代码更具有可扩展性和可维护性。另外,本专题属于PHP进阶课程。本题给出的一些例子,看似有更简单的替代方案,但实际上,在更复杂的开发中,似乎代码越多,程序的可插性和可维护性就越高。强一点,SPL和设计模式是面向对象的精髓,所以面向对象的基础一定要抓得很牢,才能更好的理解;Iterator迭代器有时也被称为游标(cursor),是编程的一种软件设计模式,一种可以在容器对象(container,如list或vector)上访问的接口,设计者无需关心其中的内容容器对象。PHP5开始支持接口,内置了Iterator接口,所以如果你定义一个类,实现了Iterator接口,那么你的类对象就是ZEND_ITER_OBJECT,否则就是ZEND_ITER_PLAIN_OBJECT。对于ZEND_ITER_PLAIN_OBJECT类,foreach会通过HASH_OF获取对象的默认属性数组,然后对该数组做一次foreach。对于ZEND_ITER_OBJECT类对象,会调用该对象实现的Iterator接口的相关函数来执行foreach。通俗地说,Iterator可以让很多不同的数据结构有一个统一的操作接口,比如数据库的结果集,同目录下的文件集,或者文本中每一行的集合。如果按照正常情况遍历一个MySQL结果集,程序需要这样写://Fetchthe"aggregatestructure"$result=mysql_query("SELECT*FROMusers");//遍历结构while($row=mysql_fetch_array($result)){//在此处处理行}要读取目录的内容,您需要编写://获取“聚合结构”$dh=opendir('/home/harryf/files');//遍历结构while($file=readdir($dh)){//在这里处理文件}要读取文本文件的内容,你需要这样写://获取"聚合结构"$fh=fopen("/home/hfuecks/files/results.txt","r");//迭代结构while(!feof($fh)){$line=fgets($fh);//dostuffwiththelinehere}以上三段代码虽然处理的是不同的资源,但是它们的作用都是遍历结果集(循环内容),所以Iterator的基本思想就是统一这三种不同的操作并使用相同的命令接口,处理不同的资源。SPL提供了6个迭代器接口(本主题后续文章会详细讲解):namefunctionTraversable遍历接口(检测一个类是否可以使用foreach遍历的接口)Iterator迭代器接口(可以在内部迭代自身外部迭代器或类接口)IteratorAggregate聚合迭代器接口(创建外部迭代器的接口)OuterIterator迭代器嵌套接口(将一个或多个迭代器包裹在另一个迭代器中)RecursiveIterator递归迭代访问接口(提供递归访问功能)SeekableIterator可索引迭代访问接口(实现搜索功能)ClassesSPL除了定义了一系列的Interface,也提供了一系列的内置类,分别对应不同的任务,大大简化了编程。要查看所有内置类,您可以使用以下代码://一个简单的foreach()遍历SPL类名foreach(spl_classes()as$key=>$value){echo$key.'->'.$value.'
';}Datastructures同时SPL也提供了一些基本类型数据结构的实现。虽然我们可以使用传统的变量类型来描述数据结构,比如用数组来描述栈(Srack)——然后使用相应的pop和push(arraypop(),arraypush()),但是你要时刻小心,因为它们毕竟不是专门为描述数据结构而设计的——一次误用可能会破坏堆栈。SPL的SplStack对象严格以栈的形式描述数据,并提供相应的方法。同时,这样的代码也应该明白它是在操作栈而不是数组,这样你的同行才能更好地理解相应的代码,而且速度更快。SPL有以下几种数据结构:DoublyLinkedLists(双向链表)、Heaps(堆)、Arrays(数组)、Map(映射)Function同时,SPL还提供了很多方便的函数,比如我们经常使用的spl_autoload_register在框架中使用(将给定函数注册为__autoload的实现)class_implements—返回指定类实现的所有接口。class_parents—返回指定类的父类。class_uses—返回给定类使用的特征iterator_apply—为迭代器中的每个元素调用用户定义的函数iterator_count—计算迭代器中元素的数量iterator_to_array—将迭代器中的元素复制到数组spl_autoload_call—尝试调用所有注册__autoload()函数以加载请求类spl_autoload_extensions—注册并返回spl_autoload函数使用的默认文件扩展名。spl_autoload_functions—返回所有已注册的__autoload()函数。spl_autoload_register——将给定函数注册为__autoload的实现