PHP SPL他们留下的宝石

PHP SPL他们留下的宝石

大家好,又见面了,我是全栈君,今天给大家准备了Idea注册码。

Rafael Dohms 上面的篇文章 让我为之惊艳。忍不住就翻译了下来。同一时候补充了部分内容。

SPL,PHP 标准库(Standard PHP Library) ,此从 PHP 5.0 起内置的组件和接口。而且从 PHP5.3 已逐渐的成熟。SPL 事实上在全部的 PHP5 开发环境中被内置。同一时候无需不论什么设置。

似乎众多的 PHP 开发者基本没有使用它,甚至闻所未闻。究其原因。能够追述到它那阳春白雪般的说明文档,使你忽略了「它的存在」。SPL 这块宝石宛如铁达尼的「海洋之心」般,被沉入海底。而如今它应该被我们捞起,并将它穿戴在应有的位置 。而这也是这篇文章所要表述的观点。

那么,SPL 提供了什么?

SPL 对 PHP 引擎进行了扩展。比如 ArrayAccess、Countable 和 SeekableIterator 等接口,它们用于以数组形式操作对象。同一时候,你还能够使用 RecursiveIterator、ArrayObejcts 等其它迭代器进行数据的迭代操作。

它还内置几个的对象比如 Exceptions、SplObserver、Spltorage 以及 splautoloadregister、splclasses、iteratorapply 等的帮助函数(helper functions)。用于重载相应的功能。

这些工具聚合在一起就好比是把多功能的瑞士军刀,善用它们能够从质上提升 PHP 的代码效率。那么。我们怎样发挥它的威力?

重载 autoloader

假设你是位「教科书式的程序猿」,那么你保证了解怎样使用 __autoload 去取代 includes/requires 操作惰性加载相应的类,对不?

但久之,你会发现你已经陷入了困境,首先是你要保证你的类文件必须在指定的文件路径中,比如在 Zend 框架中你必须使用「_」来切割类、方法名称(你怎样解决这一问题?)。

另外的一个问题,就是当项目变得越来越复杂, __autoload 内的逻辑也会变得对应的复杂。到最后,甚至你会增加异常推断。以及将全部的加载类的逻辑如数写到当中。

大家都知道「鸡蛋不能放到一个篮子中」。利用 SPL 能够分离 __autoload 的加载逻辑。

仅仅须要写个你自己的 autoload 函数。然后利用 SPL 提供的函数重载它。

比如上述 Zend 框架的问题。你能够重载 Zend loader 相应的方法,假设它没有找到相应的类,那么就使用你先前定义的函数。

<?phpclass MyLoader {    public static function doAutoload($class) {        // 本模块相应的 autoload 操作    }}spl_autoload_register( array('MyLoader', 'doAutoload') );?>

正如你所见, spl autoload register 还能以数组的形式增加多个加载逻辑。

同一时候,你还能够利用spl autoload unregister 移除已经不再须要的加载逻辑。这功能总会用到的。

迭代器

迭代是常见设计模式之中的一个,普遍应用于一组数据中的统一的遍历操作。能够毫不夸张的说,SPL 提供了全部你须要的相应数据类型的迭代器。

有个很好的案例就是遍历文件夹。常规的做法就是使用 scandir 。然后跳过「.「 和 「..」,以及其他未满足条件的文件。

比如你须要遍历个某个文件夹抽取当中的图片文件,就须要推断是否是 jpg、gif 结尾。

以下的代码就是使用 SPL 的迭代器运行上述递归寻找指定文件夹中的图片文件的样例:

<?php
class RecursiveFileFilterIterator extends FilterIterator {
    // 满足条件的扩展名
    protected $ext = array('jpg','gif');

    /**
     * 提供 $path 并生成相应的文件夹迭代器
     */
    public function __construct($path) {
        parent::__construct(new RecursiveIteratorIterator(new RecursiveDirectoryIterator($path)));
    }

    /**
     * 检查文件扩展名是否满足条件
     */
    public function accept() {
        $item = $this->getInnerIterator();
        if ($item->isFile() && 
                in_array(pathinfo($item->getFilename(), PATHINFO_EXTENSION), $this->ext)) {
            return TRUE;
        }
    }
}

// 实例化
foreach (new RecursiveFileFilterIterator('/path/to/something') as $item) {
    echo $item . PHP_EOL;
}
?

>

你可能会说。这不是花了很多其它的代码去办同一件事情吗?那么。查看上面的代码,你不是拥有了具有高度重用并且能够測试的代码了吗 :)

以下是 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 中)。

那究竟有多快呢。以下的组数据能够让你窥其究竟。

PHP SPL他们留下的宝石

假设你须要大量的数组操作。那么你能够尝试下,相信它是值得信赖的。

数据结构

同一时候 SPL 还提供了些数据结构基本类型的实现 。尽管我们能够使用传统的变量类型来描写叙述数据结构,比如用数组来描写叙述堆栈(Strack)– 然后使用相应的方式 pop 和 push(arraypop()、arraypush()),但你得时刻小心,·由于毕竟它们不是专门用于描写叙述数据结构的 — 一次误操作就有可能破坏该堆栈。

而 SPL 的 SplStack 对象则严格以堆栈的形式描写叙述数据,并提供相应的方法。

同一时候。这种代码应该也能理解它在操作堆栈而非某个数组,从而能让你的同伴更好的理解相应的代码。而且它更快。

最后,可能上述那些慘白的样例还不足矣「诱惑你」去使用 SPL。实践出真知,SPL 很多其它、更强大的功能须要你自己去挖掘。而它由于宝石般缓缓掉漆。散发着灿烂的能力。

版权声明:本文博客原创文章。博客,未经同意,不得转载。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/117560.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • C语言经典算法100例(一)

    C语言经典算法100例(一)C语言中有有许多经典的算法,这些算法都是许多人的智慧结晶,也是编程中常用的算法,这里面包含了众多算法思想,掌握这些算法,对于学习更高级的、更难的算法都会有很大的帮助,会为自己的算法学习打下坚实的基础。 接下来我们先来看10道:  (1)输出9*9乘法口诀。 //9*9乘法口诀表voidTable99(){ inti,j; for(i=1;i<=9;i+

  • MFC 如何让菜单返灰(不可点击状态)

    MFC 如何让菜单返灰(不可点击状态)

  • java中list,set,map集合的区别,及面试要点[通俗易懂]

    java中list,set,map集合的区别,及面试要点[通俗易懂](图一)1.面试题:你说说collection里面有什么子类。(其实面试的时候听到这个问题的时候,你要知道,面试官是想考察List,Set)正如图一,list和set是实现了collection接口的。(…

  • 关于记忆化搜索

    关于记忆化搜索转载自:http://blog.csdn.net/urecvbnkuhbh_54245df/article/details/5847876记忆化搜索: 算法上依然是搜索的流程,但是搜索到的一些解用动态规划的那种思想和模式作一些保存。一般说来,动态规划总要遍历所有的状态,而搜索可以排除一些无效状态。更重要的是搜索还可以剪枝,可能剪去大量不必要的状态,因此在空间开销上往往比动

  • 平均数,中位数,众数 三者的联系与区别是_中数一定是数吗

    平均数,中位数,众数 三者的联系与区别是_中数一定是数吗原文链接:http://www.360doc.com/content/18/0717/09/57858800_771067787.shtml个人理解,说简单点:一组数据中如果有特别大的数或特别小的数时,一般用中位数一组数据比较多(20个以上),范围比较集中,一般用众数其余情况一般还是平均数比较精确一、联系与区别:  1、平均数是通过计算得到的,因此它会因每一个数据的变化而变…

  • 又一个新的开始「建议收藏」

    又有一段时间没有进行整理和总结输出了,其实最近也没有闲着,也是一直在看书学习状态,看Java并发编程相关的知识,之前买了《Java并发编程的艺术》,去年看了一遍。最近又买了《Java并发编程实战》,两本书都挺好的,《Java并发编程的艺术》这本看了一遍,最近在看其中的一些章节,又有新的一些体会,新的认识。很多时候看了一遍的书,就不会在读第二遍,但是有些书适合读两遍以上,要不然根本无法理解书中的精…

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号