宝哥软件园

PHP SPL失落的宝石[SPL应用分析]

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

本文通过实例说明了phpsl的应用方法。分享给大家参考,如下:

拉斐尔多姆斯(Rafael Dohms)的上述文章让我感到惊讶,所以我忍不住翻译了它,并补充了一些内容。

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

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

那么,SPL提供了什么?

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

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

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

过载自动装载机

如果你是“教科书式程序员”,你保证知道如何使用__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_autoload_register还可以以数组的形式添加多个加载逻辑。同时,还可以使用spl_autoload_unregister删除不再需要的加载逻辑,该逻辑将一直使用。

迭代程序

迭代是常见的设计模式之一,广泛应用于数据集的统一遍历操作。毫不夸张地说,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提供的其他迭代器:

recursiveiteratorerrorcursiveiteratoritorrouteriteratoritoriteratorfilteriteratorrecursivefilteriteratorparenterrableiteratorarlimiterator globiteratorchicingiteratorreforrectoriatoriatoriarchiveiteratorororororrenwinditorapperderrorrectoriarchiveiteratoritororitorinetriateratorexitralexiterorrectororrectoriorchivercrievescheristerexit

从PHP5.3开始,将会内置更多的迭代器。我想你可以全部尝试。也许它可以改变你写传统代码的习惯。

定长数组

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

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

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

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

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

数据结构

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

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

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

更多对PHP相关内容感兴趣的读者可以查看本网站专题:《php面向对象程序设计入门教程》、《PHP数组(Array)操作技巧大全》、《PHP基本语法入门教程》、《PHP运算与运算符用法总结》、《php字符串(string)用法总结》、《php+mysql数据库操作入门教程》、《php常见数据库操作技巧汇总》、0103010

希望本文对PHP编程有所帮助。

更多资讯
游戏推荐
更多+