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 相关文章推荐
PHP5.0对象模型探索之抽象方法和抽象类
Sep 05 PHP
Mysql的常用命令
Oct 09 PHP
用PHP和ACCESS写聊天室(四)
Oct 09 PHP
实现php加速的eAccelerator dll支持文件打包下载
Sep 30 PHP
用PHP与XML联手进行网站编程代码实例
Jul 10 PHP
PHP中删除变量时unset()和null的区别分析
Jan 27 PHP
PHP无刷新上传文件实现代码
Sep 19 PHP
使用Appcan客户端自动更新PHP版本号(全)
Jul 31 PHP
php使用escapeshellarg时中文被过滤的解决方法
Jul 10 PHP
PHP基于自定义类随机生成姓名的方法示例
Aug 05 PHP
PHP结合jquery ajax实现上传多张图片,并限制图片大小操作示例
Mar 01 PHP
使用 PHP Masked Package 屏蔽敏感数据的实现方法
Oct 15 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
web server使用php生成web页面的三种方法总结
2013/10/28 PHP
JS对象转换为Jquery对象示例
2014/01/26 Javascript
类似天猫商品详情随浏览器移动的示例代码
2014/02/27 Javascript
nodejs命令行参数处理模块commander使用实例
2014/09/17 NodeJs
jQuery插件StickUp实现网页导航置顶
2015/04/12 Javascript
Nodejs 获取时间加手机标识的32位标识实现代码
2017/03/07 NodeJs
js 数字、字符串、布尔值的转换方法(必看)
2017/04/07 Javascript
Vue关于数据绑定出错解决办法
2017/05/15 Javascript
关于javascript作用域的常见面试题分享
2017/06/18 Javascript
javascript流程控制语句集合
2017/09/18 Javascript
微信小程序使用toast消息对话框提示用户忘记输入用户名或密码功能【附源码下载】
2017/12/09 Javascript
axios 处理 302 状态码的解决方法
2018/04/10 Javascript
JavaScript中set与get方法用法示例
2018/08/15 Javascript
angular6的table组件开发的实现示例
2018/12/26 Javascript
详解使用uni-app开发微信小程序之登录模块
2019/05/09 Javascript
vue实现下载文件流完整前后端代码
2020/11/17 Vue.js
[01:03]DOTA2新的征程 你的脚印值得踏上
2014/08/13 DOTA
python使用webbrowser浏览指定url的方法
2015/04/04 Python
python实现多线程抓取知乎用户
2016/12/12 Python
python 中split 和 strip的实例详解
2017/07/12 Python
使用python Telnet远程登录执行程序的方法
2019/01/26 Python
Python 2/3下处理cjk编码的zip文件的方法
2019/04/26 Python
python之pexpect实现自动交互的例子
2019/07/25 Python
python使用pip安装模块出现ReadTimeoutError: HTTPSConnectionPool的解决方法
2019/10/04 Python
Python Django框架防御CSRF攻击的方法分析
2019/10/18 Python
Python astype(np.float)函数使用方法解析
2020/06/08 Python
python算的上脚本语言吗
2020/06/22 Python
python用opencv 图像傅里叶变换
2021/01/04 Python
英国计算机产品零售商:Novatech(定制个人电脑、笔记本电脑、工作站和服务器)
2018/01/28 全球购物
巴西儿童时尚购物网站:Dinda
2019/08/14 全球购物
俄罗斯连接商品和买家的在线平台:goods.ru
2020/11/30 全球购物
材料成型专业个人求职信范文
2013/09/25 职场文书
幼儿园大班新学期寄语
2014/01/18 职场文书
信息技术课后反思
2014/04/27 职场文书
村道德模范事迹材料
2014/08/28 职场文书
CSS+HTML 实现顶部导航栏功能
2021/08/30 HTML / CSS