PHP SPL使用方法和他的威力


Posted in PHP onNovember 12, 2013

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 对应的方法,如果它没有找到对应的类,那么就使用你先前定义的函数。

<?php
class 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;
}
?>

你可能会说,这不是花了更多的代码去办同一件事情吗?那么,查看上面的代码,你不是拥有了具有高度重用而且可以测试的代码了吗 :)
PHP 相关文章推荐
php 无限极分类
Mar 27 PHP
Mysql的GROUP_CONCAT()函数使用方法
Mar 28 PHP
php 分页原理详解
Aug 21 PHP
php cookies中删除的一般赋值方法
May 07 PHP
phpcms模块开发之swfupload的使用介绍
Apr 28 PHP
解析PHP留言本模块主要功能的函数说明(代码可实现)
Jun 25 PHP
yii实现图片上传及缩略图生成的方法
Dec 04 PHP
PHP使用token防止表单重复提交的方法
Apr 07 PHP
php微信支付接口开发程序
Aug 02 PHP
PHP实现微信小程序人脸识别刷脸登录功能
May 24 PHP
PHP基于rabbitmq操作类的生产者和消费者功能示例
Jun 16 PHP
PHP解析url并得到url参数方法总结
Oct 11 PHP
PHP使用SOAP调用.net的WebService数据
Nov 12 #PHP
php获取远程图片体积大小的实例
Nov 12 #PHP
php过滤XSS攻击的函数
Nov 12 #PHP
php获取新浪微博数据API实例
Nov 12 #PHP
php生成N个不重复的随机数实例
Nov 12 #PHP
三种php连接access数据库方法
Nov 11 #PHP
PHP中ob_start函数的使用说明
Nov 11 #PHP
You might like
thinkPHP框架实现图像裁剪、缩放、加水印的方法
2017/03/14 PHP
使用laravel和ajax实现整个页面无刷新的操作方法
2019/10/03 PHP
ASP中用Join和Array,可以加快字符连接速度的代码
2007/08/22 Javascript
jquery监控数据是否变化(修正版)
2011/04/12 Javascript
ajax 同步请求和异步请求的差异分析
2011/07/04 Javascript
简单js代码实现selece二级联动(推荐)
2014/02/18 Javascript
Javascript 函数parseInt()转换时出现bug问题
2014/05/20 Javascript
JavaScript实现16进制颜色值转RGB的方法
2015/02/09 Javascript
javascript关于运动的各种问题经典总结
2015/04/27 Javascript
Javascript中的arguments对象
2016/06/20 Javascript
vuejs使用递归组件实现树形目录的方法
2017/09/30 Javascript
jQuery实现动态显示select下拉列表数据的方法
2018/02/05 jQuery
详解webpack-dev-server 设置反向代理解决跨域问题
2018/04/18 Javascript
vue动态子组件的两种实现方式
2019/09/01 Javascript
详解在Vue.js编写更好的v-for循环的6种技巧
2020/04/14 Javascript
angular组件间通讯的实现方法示例
2020/05/07 Javascript
利用Python破解验证码实例详解
2016/12/08 Python
使用Python实现一个栈判断括号是否平衡
2018/08/23 Python
python实现控制台打印的方法
2019/01/12 Python
几行Python代码爬取3000+上市公司的信息
2019/01/24 Python
python sort、sort_index方法代码实例
2019/03/28 Python
Pytorch Tensor 输出为txt和mat格式方式
2020/01/03 Python
python数据库编程 ODBC方式实现通讯录
2020/03/27 Python
详解使用python3.7配置开发钉钉群自定义机器人(2020年新版攻略)
2020/04/01 Python
keras之权重初始化方式
2020/05/21 Python
Django与AJAX实现网页动态数据显示的示例代码
2021/02/24 Python
企业面试题试卷附带答案
2015/12/20 面试题
yy婚礼司仪主持词
2014/03/14 职场文书
销售内勤岗位职责
2014/04/15 职场文书
政府法律服务方案
2014/06/14 职场文书
机械工程及其自动化专业求职信
2014/08/08 职场文书
研究生就业推荐表导师评语
2014/12/31 职场文书
公司保洁员管理制度
2015/08/04 职场文书
Python WSGI 规范简介
2021/04/11 Python
JavaWeb Servlet实现网页登录功能
2021/07/04 Java/Android
springboot 自定义配置 解决Boolean属性不生效
2022/03/18 Java/Android