SPL 全面剖析
来自百度百科 http://baike.baidu.com/view/1130234.htm?fr=aladdin
SPL(Standard PHP Library) IN PHP5
作者: 洪建家/Jiania E-mail:jiania@php.net
笔者认为下一步中大型PHP商业应用的主流的开发将会是以OO,OA软件开发模式主领潮流,从PHP5到PHP6,google Trends足以证明这一点,过去传统的面向过程的开发模式将会被弃之,如果你是一位真正合格程序员,你会发现OO所带来的好处是深远的,不仅是软件工程所带来的收益,而且此种思维理念对个人思维方式定有大的变革,你会发现你做事情开始OO方式,^_^,OO无处不在.
当然笔者不想去论述用面向过程写PHP代码所带来的好处(如简单的应用),那种单人时代的开发方式如儿童时代已不适合需求复杂,变化过快的现代商业环境.笔者发现,如今支持面向过程的开发者大多知识不够全,不够广.还不足以用OO来解决商业开发.当然这不是绝对,但一位有着C++,JAVA, Smalltalk、EIFFEL等开发语言背景的程序员,他会无一不支持OO开发模式,相反网络知识框架基础较少,各种协议一知半解,只会PHP的开发人员他们会觉得面向过程最适合他们.
不断有人在网上问笔者,目前主流的CMS我要用哪种来做二次开发,来做为中大型业务系统平台?其实这个问题很简单,几点就可以定义一个CMS的前景如何?
a.文档的完善与标准如何?
b.背后商业公司或是财团支持如何?
c.采用OO还是面向过程?
d.业务与显示是否分离与清晰?C OR VC OR MVC
e.数据结构如何,数据表优化如何?数据驱动支持?
f.开发进度如何?目前核心开发成员水平如何,要注意原核心团队的去留?
g.代码内置调试如何,代码纠错处理过程怎样?
h.有无自己核心开发框架?有无采用流行的框架?
i.权限管理等基础CMS功能如何?可扩展,或开发程度如何?
j.现在用户群如何?可通过google trends来找答案
综上所述,我们怎样选择CMS做二次开发.当然还有诸合目前本身团队的水平等等因素要想进去,希望决策者不要失误,以免将来损失惨重.
不管是二次开发,还是自己全部重新设计,我们都得要有一个大前提,那就是最大化提高系统平台生命周期,国内很多phper开发者,很多项目的生命周期短得可怜,阅其代码坚酸难懂,接手的开发人员像被强奸的感觉, 笔者认为合格的PHP程序员应把代码看成是一种艺术, 一个好不好的操作平台是否拥有良好的可扩展性,布局,可维护性是其根本的基础.其核心框架必需高度抽象化,有良好的命名空间与对象接口, 这样才能算是进入贵族艺术编程世界.
一个项目的成功不是决定于技术的先进度如何,它有很多因素决定.在此,笔者就不在这里谈论如何运作网络商业,只谈PHP极限编程艺术世界.
下面笔者就带大家从草根程序员进入php 5,php6未来主流开发世界.目前不收大家门票,^_^.全部我买单了,让国内PHPER 体验PHP新的时尚世界.OK,开始我们的php贵族之旅!!!
Standard PHP Library(PHP标准库,PHP5以后编译后自带的框架)为解决一些在Web开发中普遍的问题,提供了一系列的接口(interface)和类库(classes)的。这些所有类库,你都可以在PHP编译本中找到(extSPL下的文件夹),基类文件在SPL.PHP等文件内,SPL提供了迭代器(Iterator)、数组对象(ArrayObject)、运行期违例(RuntimeException InvalidArgumentException……)、观察者模式(Observer Pattern)等一些解决方案。详情可参考官方的API.
查看SPL所有类与方法,我们可以用以下命令:
Pring_r(spl_classes());
SPL有以下接口(10大接口)
1.ArrayAccess 其功能是使类可以像PHP中的数组一样操作。有点类似于.net平台的index操作。
2.Traversable 是Zend引擎的内置接口,它是能让类用于foreach语句的接口,但是在PHP中并不能直接实现Traversable。只能间接地通过Iterator或IteratorAggregate接口实现。
3.IteratorAggregate(继承Traversable,是他的儿子)是除Iterator之外另一个从Traversable接口中继承而来的。其接口也很简单,只有一个函数。就是返回一个迭代器实例
4.Iterator(也是继承Traversable,是他的儿子),SPL中大部分接口和类都是从这个接口继承而来的。
5.RecursiveIterator (继承Iterator,为Traversable的孙子),递归迭代器,通过hasChildren()和getChildren()两个函数实现递归遍历子元素。
6.Countable 这接口就一个count()函数,返回结果集的数量。实现这个接口的类可以用count()函数查询其结果集。
7.Serializable 该接口实现序列化和反序列化的接口。在没有SPL之前,可以通过__sleep() 和__wakeup()实现相同的功能,若同时实现了Serializable 接口和_sleep() 和__wakeup(),则只有Serializable接口的函数启作用。
8.SplObserver Observer观察者模式的中的观察者。
9.SplSubject Observer观察者模式的中的发布者。
10.OuterIterator 它的实现者可以包含一个或多个迭代器成员,即可以通过getInnerIterator()接口函数获取内部的迭代器,也可以直接通过类本身实现的Iterator接口遍历内部的迭代器数据。这在SPL是一个非常重要的接口,SPL中很多内置的迭代器实现了这个接口。
(接口分析未完成,更新中...)
SPL中已经声明的类。
1.DirectoryIterator 这个类用来查看一个目录中的所有文件和子目录
2.FilterIterator 这是一个抽象类,它实现了OuterIterator接口。它包装一个已有的迭代器类,通过抽象方法accept()过滤掉不需要的内容,形成一个新的迭代器。
3.LimitIterator 这也是一个实现OuterIterator的类。它有点类似于SQL中的LIMIT语句。它通过包装一个已有迭代器,然后截取其中某一段数据形成一个新的迭代器。
4.RecursiveDirectoryIterator 递归查看一个目录中的所有文件的子目录。
5.SimpleXMLIterator 一个遍历XML内容的类
6.IteratorIterator 实现对迭代器的包装,这也是SPL中对OuterIterator默认实现。
7.InfiniteIterator 从字面意思就知道,这是个无限循环的迭代器,当next()到达最后时,会自动调用rewind()函数,又从头开始。
8.AppendIterator 它实现了对一系统迭代器的包装,并且可以在运行过程中添加新的迭代器。
9.SplFileObject 文件操作类,可以按行的方式遍历文件内容。同时还能获取文件的大小及其它详细信息。
10.SplFileInfo 获取文件信息类。SplFileObject 从该类继承。
错误处理是一大块:
下面来我讲讲PHP->SPL 关于错误处理方面的架构:
Exception 这是错误处理的接口,这是个值得一提,在所有程序中都会用到的父类.
笔者也想不通,为什么作者不作Exception做为一个接口呢???我得想想.
下面分为两大基类
一个是LogicException (逻辑错误处理类)
一个是RuntimeException(实时错误处理类)我会详细说明此这9大接口的设计理念.