- 浏览: 800291 次
- 性别:
- 来自: 北京
-
文章分类
最新评论
-
aliang032:
文章很赞,有几个缺点:1、是你的服务端是单进程的,如果进程挂了 ...
php socket编程实例详解 -
最佳蜗牛:
最佳蜗牛 写道是不是缺少了一个toolbar.Realize( ...
wxPython写的简易编辑器(原创) -
最佳蜗牛:
是不是缺少了一个toolbar.Realize()?
wxPython写的简易编辑器(原创) -
最佳蜗牛:
2.7.3版本里不能显示工具栏的图标
wxPython写的简易编辑器(原创) -
sogo6:
我怎么安装的也不行? 裸奔啊。。。。。
让TextMate支持中文显示
英文原文:http://www.rafaeldohms.com.br/2009/06/03/spl-a-hidden-gem/en/
Standard PHP Library (SPL):http://cn.php.net/spl
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 以及 spl_autoload_register、spl_classes、iterator_apply 等的帮助函数(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; }
你可能会说,这不是花了更多的代码去办同一件事情吗?那么,查看上面的代码,你不是拥有了具有高度重用而且可以测试的代码了吗 :^)
下面是 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(array_pop()、array_push()),但你得时刻小心,·因为毕竟它们不是专门用于描述数据结构的 -- 一次误操作就有可能破坏该堆栈。
而 SPL 的 SplStack 对象则严格以堆栈的形式描述数据,并提供对应的方法。同时,这样的代码应该也能理解它在操作堆栈而非某个数组,从而能让你的同伴更好的理解相应的代码,并 且它更快。
最后,可能上述那些惨白的例子还不足矣“诱惑你”去使用 SPL。实践出真知,SPL 更多、更强大的功能需要你自己去挖掘。而它正如宝石般的慢慢雕砌,才能散发光辉。
PS,有关 SPL 详细的中文文档,阮一峰同学这里有份更详细的笔记《PHP SPL笔记 》,推荐。
发表评论
-
基于libmemcached,php扩展memcached的安装
2011-03-29 18:23 1662一,为什么要装memcached扩展 memcached ... -
OpenCV和PHP的人脸识别技术
2011-03-15 00:52 4088OpenCV安装之前必须依赖的包:(请先安装好) pkgco ... -
php代码安全:增加这三行php代码的安全,性能和兼容性
2010-10-09 16:42 1326如何改进以下的这行php代码: <? echo(&q ... -
PHP代码安全:register_globals的设置off
2010-10-09 16:29 1455在PHP编码的时候,要考虑到很多安全问题,不然将可能被攻击。下 ... -
PHP 加速器:APC、eAccelerator、XCache比较
2010-09-29 11:24 2752一直想找一些关于PHP加速的文章,偶然看到杀 客 的这篇文 ... -
PHP APC 配置详解
2010-09-29 10:16 6586APC是Alternative PHP Cache的简称,是 ... -
安装PHP的Parsekit扩展
2010-09-29 09:54 1335安装PHP的Parsekit扩展 从http://pecl. ... -
PHP算法:折半查找法(又称二分查找法)
2010-09-26 13:12 2375二分查找又称折半查找 ,它是一种效率较高的查找方法。 ... -
PHP算法:直接插入排序
2010-09-26 12:56 1384直接插入排序(Straight Insertion Sort) ... -
PHP算法:冒泡排序与快速排序
2010-09-26 12:41 1909写一个排序算法,可以是冒泡排序或者快速排序,假设待排序对象是一 ... -
[转]PHP的错误报告error_reporting
2010-09-25 11:41 1596error_reporting 设定 ... -
PHP正则表达式:将1234567890转换成1,234,567,890 每3位用逗号隔开的形式
2010-09-25 10:52 1729“四项处理”的作用是与字符相匹配,然后根据是否能找到要匹配的字 ... -
PHP函数篇详解十进制、二进制、八进制和十六进制转换函数说明
2010-09-25 10:19 4741PHP函数篇详解十进制、二进制、八进制和十六进制互相转 ... -
php socket通信的基础知识
2010-09-25 09:03 7504迷人而又让人容易糊涂的套接字(Sockets)。Sockets ... -
posix和perl标准的正则表达式区别
2010-09-25 08:29 5590正则表达式(Regular Expre ... -
php socket编程实例详解
2010-09-24 23:10 12647让我们以一个基本的例子开始---一个接收输入字符串,处理并返回 ... -
PHPER进阶必备知识:详解SQL性能优化十条经验
2010-09-17 22:02 8681.查询的模糊匹配 尽量避免在一个复杂查询里面使用 LIKE ... -
mysql_fetch_array与mysql_fetch_row有什么区别?
2010-09-17 21:54 4075两种查询函数array / row区别 格式:mysql ... -
php 排序函数 sort、rsort、asort、arsort、ksort、krsort的区别
2010-09-17 18:43 34861,快速创建数组的函数range() 比如range()函数 ... -
在smarty模板文件当中,直接使用PHP代码
2010-09-11 23:19 1854smarty允许在模板中直接嵌入 php 脚本. 是否处理这些 ...
相关推荐
图解AUTOSAR-CP-WatchdogDriver逻辑图一键下载
光学多层膜系统模拟仿真matlab代码 这段代码是一个光学多层膜系统的模拟程序,计算了TE模和TM模的反射率,并绘制了反射率随波长和入射角变化的等高线图。 这里是代码的主要流程: 1. 加载材料参数数据(Al2O3、Si3N4、SiO2、Ag)和波长数据(lambda)。 2. 循环遍历不同的入射角度(theta0)。 3. 对于每个入射角度,计算TE模和TM模的传输矩阵,包括各个层的传输矩阵。 4. 计算反射率,并将TE模和TM模的反射率取平均作为总的反射率。 5. 将总的反射率随波长和入射角度的变化绘制成等高线图。 这段代码非常详细,而且注释也很清晰,让人容易理解。 不过最后一行的中文注释应该是解释如何使用`colormap`函数来设置绘图的颜色映射,可以将其翻译为“设置颜色映射为Jet色彩”。 ,多层膜系统模拟; TE模和TM模反射率计算; 波长和入射角变化; 传输矩阵; 平均反射率; 绘制等高线图; 颜色映射设置。,光学多层膜系统模拟仿真:Matlab代码实现
`基于PLC的教室灯控制系统的设计电气设计程序设计组态设计S7-200和组态王 ,基于PLC的教室灯控制系统的设计; 电气设计; 程序设计; 组态设计; S7-200; 组态王,基于S7-200与组态王的教室灯控制系统的电气与程序设计
内容概要:本文提供了100道C语言的经典编程题,并给出了详细的代码实现及其解析。涵盖的知识点广泛,涉及数学计算、字符操作、图形绘制、链表、数组操作以及文件处理等多种应用场景。这些习题不仅能够帮助初学者快速掌握C语言的基础语法和技术要点,还能让学习者通过实战演练加深理解和记忆。每个题目都有具体的任务描述,并给出了解决思路和关键的技术提示。 适合人群:正在学习C语言的初学者,或者是想要巩固基础知识并提高编码技能的学习者。 使用场景及目标:可用于日常学习、课堂作业、在线竞赛以及面试准备等各种场合。对于想要系统学习C语言并希望拥有丰富实践经验的人来说,这份资料尤为珍贵。 阅读建议:建议读者从易到难逐步尝试解答这些习题,在实践中不断加深对概念的理解和技巧的应用。同时鼓励大家动手修改现有代码、优化性能或者挑战更多变种的问题以增强创新能力。
Comsol热-流-固-损伤耦合模拟分析,THMD热-流-固-损伤耦合模型,在这个模型里面考虑了温度场、应力场、压力场和损伤场,采用的是Comsol内置的接口建模 整个模型呈正方形,内部开一个圆孔 在圆孔内壁施加高压低温流体,模型外边界在这个模型里面考虑了温度场、应力场、压力场和损伤场,采用的是Comsol内置的接口 只有模型和参考文献 ,Comsol模拟; 热-流-固-损伤耦合; 正方形模型; 圆孔内壁流体; 接口建模; 温度场; 应力场; 压力场; 损伤场,Comsol热流固损伤耦合模型的正方形正方形模型分析
资源包含mui.css、icons-extra.css、mui.ttf、mui-icons-extra.ttf
内容概要:本文档详尽介绍了CMT453x系列蓝牙芯片的关键特性及其应用。该系列采用32位ARM Cortex-M0内核,主频最高可达64MHz,支持BLE 5.2,具备出色的功耗管理和丰富的外围接口。其主要特点是高效的射频性能(如灵敏度、功率控制)、强大的内存配置(256KB Flash和48KB SRAM)、多种低功耗模式、完善的模拟/数字转换和各类串行接口。文档还涵盖了芯片的详细电气参数、工作环境要求、封装形式及具体引脚配置等内容,有助于开发者充分利用芯片的各项特性进行产品研发。 适合人群:适用于硬件开发工程师、嵌入式系统设计师以及专注于低功耗物联网终端产品研发的专业人士。 使用场景及目标:该系列芯片主要用于开发各种类型的蓝牙设备,包括但不限于智能家居产品、健康监测仪器以及其他需要短距离无线通讯和高效能耗管理的消费电子产品。 其他说明:本文档不仅包含了详细的芯片内部架构和技术细节,还包括了许多关于系统级应用的设计建议和注意事项,对于确保设计质量和加快项目进度有着重要的指导意义。
【图像识别与分类项目】2017-2018年度工程实践项目,专注于图像识别与分类技术,旨在通过算法实现高效准确的图像类别识别。项目文件为chy4.zip,包含相关代码与数据集,适用于图像处理与机器学习领域的研究与实践。
ANPC-VSG(同步机)控制,基于有源中点钳位三电平的VSG构网型逆变器控制,采用LCL型滤波器,电压电流双闭环控制 1.VSG控制 2.中点电位平衡控制 3.电压电流双闭环控制 提供参考文献以及VSG原理和下垂系数计算方法 支持simulink2022以下版本,联系跟我说什么版本,我给转成你版本(默认发2016b) ,1.VSG控制; 2.中点电位平衡控制; 3.LCL型滤波器; 4.电压电流双闭环控制; 5.下垂系数计算方法。,基于ANPC-VSG控制与双闭环策略的构网型逆变器控制方法研究
易语言,取文本随机个数的文本(中文英文都可以)不会出现中文只取出了一半而出现乱码的问题。。 就一些简单代码,解决复杂问题, 压缩包里面有模块和源码,能直接使用。供大家学习,自用的。
基于西门子PLC的5*5立体仓库控制系统设计 包含:组态仿真,设计图纸,设计文档0 西门子s7-1200plc,博图v16编程 ,基于西门子PLC的5*5立体仓库控制系统设计; 组态仿真; 设计图纸; 博图v16编程; 西门子s7-1200plc,基于博图v16编程的西门子s7-1200 PLC 5*5立体仓库控制系统设计及组态仿真
基于Matlab的函数逼近与曲线(面)拟合 12页说明文档 包括曲线拟合的线性最小二乘法、多项式拟合、拟合曲线的线性变、最佳均方逼近、三角多项式逼近、随机数据点上的二元拟合相关程序 程序已调通,可直接运行 ,关键词:Matlab;函数逼近;曲线拟合;面拟合;线性最小二乘法;多项式拟合;线性变换;最佳均方逼近;三角多项式逼近;随机数据点;二元拟合;程序调通。,Matlab函数逼近与面曲线拟合的算法与实践
comsol声子晶体建模文件教程,带隙计算,传输损耗计算 ,comsol;声子晶体建模;文件教程;带隙计算;传输损耗计算,COMSOL声子晶体建模与传输损耗计算教程
花椒油检验表格(食品香辛料质量验收记录表)检验表格(食品香辛料质量验收记录表).docx
水测试试纸行业剖析:欧洲是全球最大的市场,占40%的份额.pdf
window XP系统 IE 浏览器 浏览 https 网页时,出现证书错误或者页面显示不安全,通过安装此补丁可解决
1949-2020年各省人均GDP数据 1、时间:1952-2020年 2、来源:国家统计j、统计nj 3、指标:各省人均GDP 4、范围:31省
1952-2020年全国人均GDP数据 1、时间:1952-2020年 2、来源:国家统计j、统计nj 3、指标:全国人均GDP 4、范围:全国层面
客户信息管理:新增客户,修改客户,删除客户,客户列表 药品类别信息管理:新增药品类别,修改药品类别,删除药品类别,药品类别列表 药品信息管理:药品信息查询,新增药品信息,修改、删除,出库,入库 药品出入库记录:药品出入库记录列表展示 用户信息管理:新增用户,删除用户 修改密码 退出系统。内容来源于网络分享,如有侵权请联系我删除。
UL 9540-2023