• 售前

  • 售后

热门帖子
入门百科

PHP SPL 被遗落的宝石【SPL应用浅析】

[复制链接]
123457245 显示全部楼层 发表于 2021-10-25 19:16:17 |阅读模式 打印 上一主题 下一主题
本文实例报告了PHP SPL应用方法。分享给大家供大家参考,具体如下:
Rafael Dohms 上面的篇文章 让我为之惊艳,忍不住就翻译了下来,同时增补了部分内容。
SPL,PHP 标准库(Standard PHP Library) ,从 PHP 5.0 起内置的组件和接口,而且从 PHP5.3 已渐渐的成熟。SPL 其实在全部的 PHP5 开发环境中被内置,同时无需任何设置。
好像众多的 PHP 开发职员基本没有使用它,以致闻所未闻。究其缘故起因,可以追述到它那阳春白雪般的分析文档,使你忽略了「它的存在」。SPL 这块宝石犹如铁达尼的「海洋之心」般,被沉入海底。而现在它应该被我们捞起,并将它穿着在应有的位置 ,而这也是这篇文章所要表述的观点。
那么,SPL 提供了什么?
SPL 对 PHP 引擎进行了扩展,例如 ArrayAccessCountable SeekableIterator 等接口,它们用于以数组情势操作对象。同时,你还可以使用 RecursiveIteratorArrayObejcts 等其他迭代器进行数据的迭代操作。
它还内置几个的对象例如 ExceptionsSplObserverSpltorage 以及 splautoloadregistersplclassesiteratorapply 等的帮助函数(helper functions),用于重载对应的功能。
这些工具聚合在一起就好比是把多功能的瑞士军刀,善用它们可以从质上提拔 PHP 的代码效率。那么,我们如何发挥它的威力?
重载 autoloader
假如你是位「教科书式的程序员」,那么你包管相识如何使用
  1. __autoload
复制代码
去代替 includes/requires 操作惰性载入对应的类,对不?
但久之,你会发现你已经陷入了逆境,首先是你要包管你的类文件必须在指定的文件路径中,例如在 Zend 框架中你必须使用「_」来分割类、方法名称(你如何解决这一题目?)。
别的的一个题目,就是当项目变得越来越复杂,
  1. __autoload
复制代码
内的逻辑也会变得相应的复杂。到末了,以致你会参加非常判断,以及将全部的载入类的逻辑如数写到其中。
大家都知道「鸡蛋不能放到一个篮子中」,使用 SPL 可以分离
  1. __autoload
复制代码
的载入逻辑。只必要写个你本身的 autoload 函数,然后使用 SPL 提供的函数重载它。
例如上述 Zend 框架的题目,你可以重载 Zend loader 对应的方法,假如它没有找到对应的类,那么就使用你先前定义的函数。
  1. <?php
  2. class MyLoader {
  3.   public static function doAutoload($class) {
  4.     // 本模块对应的 autoload 操作
  5.   }
  6. }
  7. spl_autoload_register( array('MyLoader', 'doAutoload') );
  8. ?>
复制代码
正如你所见,
  1. spl_autoload_register
复制代码
还能以数组的情势参加多个载入逻辑。同时,你还可以使用
  1. spl_autoload_unregister
复制代码
移除已经不再必要的载入逻辑,这功能总会用到的。
迭代器
迭代是常见筹划模式之一,普遍应用于一组数据中的统一的遍历操作。可以毫不夸张的说,SPL 提供了全部你必要的对应数据类型的迭代器。
有个非常好的案例就是遍历目录。通例的做法就是使用
  1. scandir
复制代码
,然后跳过「.「 和 「..」,以及其它未满意条件的文件。例如你必要遍历个某个目录抽取其中的图片文件,就必要判断是否是 jpg、gif 末了。
下面的代码就是使用 SPL 的迭代器实行上述递归探求指定目录中的图片文件的例子:
  1. <?php
  2. class RecursiveFileFilterIterator extends FilterIterator {
  3.   // 满足条件的扩展名
  4.   protected $ext = array('jpg','gif');
  5.   /**
  6.    * 提供 $path 并生成对应的目录迭代器
  7.    */
  8.   public function __construct($path) {
  9.     parent::__construct(new RecursiveIteratorIterator(new RecursiveDirectoryIterator($path)));
  10.   }
  11.   /**
  12.    * 检查文件扩展名是否满足条件
  13.    */
  14.   public function accept() {
  15.     $item = $this->getInnerIterator();
  16.     if ($item->isFile() &&
  17.         in_array(pathinfo($item->getFilename(), PATHINFO_EXTENSION), $this->ext)) {
  18.       return TRUE;
  19.     }
  20.   }
  21. }
  22. // 实例化
  23. foreach (new RecursiveFileFilterIterator('/path/to/something') as $item) {
  24.   echo $item . PHP_EOL;
  25. }
  26. ?>
复制代码
你大概会说,这不是花了更多的代码去办同一件事变吗?那么,查看上面的代码,你不是拥有了具有高度重用而且可以测试的代码了吗 :)
下面是 SPL 提供的其他的迭代器:
RecursiveIterator
RecursiveIteratorIterator
OuterIterator
IteratorIterator
FilterIterator
RecursiveFilterIterator
ParentIterator
SeekableIterator
LimitIterator
GlobIterator
CachingIterator
RecursiveCachingIterator
NoRewindIterator
AppendIterator
RecursiveIteratorIterator
InfiniteIterator
RegexIterator
RecursiveRegexIterator
EmptyIterator
RecursiveTreeIterator
ArrayIterator

自 PHP5.3 开始,会内置其他更多的迭代器,我想你都可以实行下,或许它能改变你编写传统代码的风俗。
SplFixedArray
SPL 还内置了一系列的数组操作工具,例如可以使用 SplFixedArray 实例化一个固定长度的数组。那么为什么要使用它?由于它更快,以致它关系着你的工资题目 :)
我们知道 PHP 通例的数组包含差别类型的键,例如数字、字符串等,而且长度是可变的。正是由于这些「高级功能」,PHP 以散列(hash)的方式通过键得到对应的值 -- 其实这在特定环境这会造成性能题目。
而 SplFixedArray 由于是使用固定的数字键,以是它并没有使用散列存储方式。不确切的说,以致你可以以为它就是个 C 数组。这就是为什么 SplFixedArray 会比通常数组要快的缘故起因(仅在 PHP5.3 中)。
那到底有多快呢,下面的组数据可以让你窥其究竟。

假如你必要大量的数组操作,那么你可以实行下,信托它是值得信托的。
数据结构
同时 SPL 还提供了些数据结构基本类型的实现 。固然我们可以使用传统的变量类型来形貌数据结构,例如用数组来形貌堆栈(Strack)-- 然后使用对应的方式 pop 和 push(
  1. arraypop()
复制代码
  1. arraypush()
复制代码
),但你得时候小心,·由于究竟它们不是专门用于形貌数据结构的 -- 一次误操作就有大概破坏该堆栈。
而 SPL 的 SplStack 对象则严格以堆栈的情势形貌数据,并提供对应的方法。同时,如许的代码应该也能明白它在操作堆栈而非某个数组,从而能让你的搭档更好的明白相应的代码,而且它更快。
末了,大概上述那些惨白的例子还不足矣「勾引你」去使用 SPL。实践出真知,SPL 更多、更强盛的功能必要你本身去发掘。而它正如宝石般的慢慢雕砌,才能散发光辉。
更多关于PHP干系内容感兴趣的读者可查看本站专题:《php面向对象程序筹划入门教程》、《PHP数组(Array)操作本领大全》、《PHP基本语法入门教程》、《PHP运算与运算符用法总结》、《php字符串(string)用法总结》、《php+mysql数据库操作入门教程》及《php常见数据库操作本领汇总》
盼望本文所述对大家PHP程序筹划有所帮助。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x

帖子地址: 

回复

使用道具 举报

分享
推广
火星云矿 | 预约S19Pro,享500抵1000!
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

草根技术分享(草根吧)是全球知名中文IT技术交流平台,创建于2021年,包含原创博客、精品问答、职业培训、技术社区、资源下载等产品服务,提供原创、优质、完整内容的专业IT技术开发社区。
  • 官方手机版

  • 微信公众号

  • 商务合作