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大接口的设计理念.

SPL 全面剖析的更多相关文章

  1. 探索C#之6.0语法糖剖析

    阅读目录: 自动属性默认初始化 自动只读属性默认初始化 表达式为主体的函数 表达式为主体的属性(赋值) 静态类导入 Null条件运算符 字符串格式化 索引初始化 异常过滤器when catch和fin ...

  2. jQuery之Deferred源码剖析

    一.前言 大约在夏季,我们谈过ES6的Promise(详见here),其实在ES6前jQuery早就有了Promise,也就是我们所知道的Deferred对象,宗旨当然也和ES6的Promise一样, ...

  3. [C#] 剖析 AssemblyInfo.cs - 了解常用的特性 Attribute

    剖析 AssemblyInfo.cs - 了解常用的特性 Attribute [博主]反骨仔 [原文]http://www.cnblogs.com/liqingwen/p/5944391.html 序 ...

  4. Membership三步曲之进阶篇 - 深入剖析Provider Model

    Membership 三步曲之进阶篇 - 深入剖析Provider Model 本文的目标是让每一个人都知道Provider Model 是什么,并且能灵活的在自己的项目中使用它. Membershi ...

  5. 《AngularJS深度剖析与最佳实践》简介

    由于年末将至,前阵子一直忙于工作的事务,不得已暂停了微信订阅号的更新,我将会在后续的时间里尽快的继续为大家推送更多的博文.毕竟一个人的力量微薄,精力有限,希望大家能理解,仍然能一如既往的关注和支持sh ...

  6. 探索c#之Async、Await剖析

    阅读目录: 基本介绍 基本原理剖析 内部实现剖析 重点注意的地方 总结 基本介绍 Async.Await是net4.x新增的异步编程方式,其目的是为了简化异步程序编写,和之前APM方式简单对比如下. ...

  7. PHP 高级编程(4/5) - SPL异常类之 LogicException 逻辑异常

    SPL 提供了一系列标准异常.日常的使用中我们应该根据需求科学的使用它们,来使我们的程序更加健壮.LogicException 是从 Exception 基类派生的,没有添加任何附加方法.抛出逻辑异常 ...

  8. PHP 高级编程(3/5) - 使用SPL(标准PHP库)实现观察者模式

    SPL(标准PHP库 - Standard PHP Library)是PHP5面向对象功能中重要的部分.原文解释是这样的“The Standard PHP Library (SPL) is a col ...

  9. ASP.NET Core管道深度剖析(2):创建一个“迷你版”的管道来模拟真实管道请求处理流程

    从<ASP.NET Core管道深度剖析(1):采用管道处理HTTP请求>我们知道ASP.NET Core请求处理管道由一个服务器和一组有序的中间件组成,所以从总体设计来讲是非常简单的,但 ...

随机推荐

  1. Node.js学习笔记 01 搭建静态服务器

    希望这篇文章能解决你这样一个问题:“我现在已经了解了一些Node.Js基本概念了,怎么搭一台静态服务器呢?” 请参考一下博主的前两篇文章: 完全面向于初学者的Node.js指南 Node.Js的Mod ...

  2. penmount串口触摸屏加载

    static irqreturn_t pm_interrupt(struct serio *serio,  unsigned char data, unsigned int flags){ struc ...

  3. Machine Learning 学习笔记 (1) —— 线性回归与逻辑回归

    本系列文章允许转载,转载请保留全文! [请先阅读][说明&总目录]http://www.cnblogs.com/tbcaaa8/p/4415055.html 1. 梯度下降法 (Gradien ...

  4. SqlServer中Sql语句的逻辑执行顺序

    准备数据 Sql脚本如下,两张表,一张客户表Customers只包含customerid和city字段,一张订单表Orders包含orderid和customerid(关联Customers的cust ...

  5. 结对开发:7-magic用户调研报告

    用户调研报告 班级   信1201-2班  学号   20122929     姓名  崔乐乐 项目名称:7-magic 调研时间: 2015/4/14 调研主题:7-magic游戏的用户需求度调研 ...

  6. javascript 对象数组排序

    参考地址:http://blog.csdn.net/kavensu/article/details/17851329

  7. 网络---中断套接字Socket

    package socketpack_2; import java.awt.BorderLayout; import java.awt.EventQueue; import java.awt.even ...

  8. MySQL自动化安装(双主多从读写分离)

    shell #!/bin/bash # Create by # version 1.0 # // # # check out lockfile whether or not exist IsInput ...

  9. js读取屏幕长宽

    网页可见区域宽 document.body.clientWidth 网页可见区域高 document.body.clientHeight 网页可见区域宽(包括边线的宽) document.body.o ...

  10. WWDC2014 debugging_in_xcode_6 总结

    1.GCD的waiting queue 可以在Xcode左侧的面板中查看. 2.可以对View进行debug类似reveal. 3.查看运行时的对象,对于自定义对象可以实现- (id)debugQui ...