我把SPL分为五个部分:Iterator、Classes、Exceptions、Datastructures、Function;而classes就是要引入一些类(Iterator和Datastructures相关的类在各自的文章中),在引入这些类之前先引入几个接口:ArrayAccess(数组访问)接口http://php.net/manual/zh/clas...只要实现了这个接口,对象就可以像数组一样操作了。ArrayAccess接口包含四个必须部署的方法。这四个方法分别传入数组的key和value:*offsetExists($offset)这个方法用来告诉phpoffset指定的key是否有值。它应该返回true或false。检查是否存在偏移*offsetGet($offset)该方法用于返回键偏移指定的值。获取一个偏移量的值*offsetSet($offset,$value)该方法用于在对象内部设置一个值,对于只读集合可以从该函数抛出异常。获取偏移位置的值*offsetUnset($offset)当通过unset()或为键分配null值从数组中删除值时使用此方法。在数字数组的情况下,不应删除此偏移量并且不应重新索引数组,除非那是您特别想要的行为。重置一个位置的偏移值/***一个可以像数组一样使用的类*/classArticleimplementsArrayAccess{public$title;公共$作者;公共$类别;函数__construct($title,$author,$categoryry){$this->title=$title;$this->author=$author;$this->category=$类别;}/***由ArrayAccess接口定义*给定它的键设置一个值,例如$A['标题']='富';*@param混合键(字符串或整数)*@param混合值*@returnvoid*/functionoffsetSet($key,$value){if(array_key_exists($key,get_object_vars($this))){$this->{$键}=$值;}}/***由ArrayAccess接口定义*返回一个给定键的值,例如echo$A['标题'];*@param混合键(字符串或整数)*@return混合值*/functionoffsetGet($key){if(array_key_exists($key,get_object_vars($this))){return$this->{$key};}}/***由ArrayAccess接口定义*通过它的键取消设置值,例如取消设置($A['标题']);*@param混合键(字符串或整数)*@returnvoid*/functionoffsetUnset($key){if(array_key_exists($key,get_object_vars($this))){取消设置($this->{$key});}}/***由ArrayAccess接口定义*检查值是否存在,如果它是键,例如isset($A['title'])*@param混合键(字符串或整数)*@returnboolean*/functionoffsetExists($offset){returnarray_key_exists($offset,get_object_vars($this));}}//创建对象$A=newArticle('SPLRocks','JoeBloggs','PHP');//检查它看起来像什么echo'InitialState:
';print_r($A);echo'
';//使用数组语法更改标题$A['title']='SPL_really_rocks';//尝试设置一个不存在的属性(忽略)$A['notfound']=1;//取消作者设置fieldunset($A['author']);//再次检查它是什么样子echo'FinalState:
';print_r($A);echo'
';Serializable接口接口摘要Serializable{/*方法*/abstractpublicstringserialize(void)abstractpublicmixedunserialize(string$serialized)}具体参考:http://php.net/manual/zh/clas...简单的说,当实际发现了Serializable接口的类,被实例化后的对象在序列化或反序列化时会自动调用类中对应的序列化或反序列化方法;类obj实现可序列化{private$data;publicfunction__construct(){$this->data="自动调用方法:";}publicfunctionserialize(){$res=$this->data.__FUNCTION__;返回序列化($res);}//然后将上面的序列化值作为$data参数传入;publicfunctionunserialize($data){$this->data=unserialize($res);}publicfunctiongetData(){return$this->data;}}$obj=newobj;$ser=serialize($obj);$newobj=unserialize($ser);//在调用getData方法之前,serialize和unserialize都隐式调用了var_dump($newobj->getData());IteratorAggregate(聚合迭代器)接口类总结IteratorAggregateextendsTraversable{/*method*/abstractpublicTraversablegetIterator(void)}Traversable用于检测一个类是否可以使用foreach遍历接口,在php代码中不能使用。只有PHP内部类(用C编写的类)才能直接实现Traversable接口;php代码使用Iterator或IteratorAggregate接口实现遍历。实现该接口的类内部有一个getIterator方法来获取迭代器实例;myData类实现IteratorAggregate{private$array=[];constTYPE_INDEXED=1;constTYPE_ASSOCIATIVE=2;公共函数__construct(array$data,$type=self::TYPE_INDEXED){reset($data);while(list($k,$v)=each($data)){$type==self::TYPE_INDEXED?$this->array[]=$v:$this->array[$k]=$v;}}publicfunctiongetIterator(){returnnewArrayIterator($this->array);}}$obj=newmyData(['one'=>'php','javascript','three'=>'c#','java',]/*,TYPE1or2*/);//↓↓遍历的时候,其实就是遍历getIterator中实例的iterator对象。迭代后的数据就是这里传入的数据foreach($objas$key=>$value){var_dump($key,$value);echoPHP_EOL;}Countable接口类实现了Countable接口后,在接口中计数时以返回值为准//例一,BAD:(classCountMe{protected$_myCount=3;publicfunctioncount(){return$this->_myCount;}}$countable=newCountMe();echocount($countable);//结果为“1”,与预期不符//Example二,好的:)ClassCountMeimplementsCountable{protected$_myCount=3;publicfunctioncount(){返回$this->_myCount;}}$countable=newCountMe();echocount($countable);//resultis"3"ArrayObject类简单的说这个类可以像操作Object一样操作Array;这是一个非常有用的课程;/***一个简单的数组***/$array=array('koala','kangaroo','wombat','wallaby','emu','kiwi','kookaburra','platypus');/***创建数组对象***/$arrayObj=newArrayObject($array);//添加一个元素$arrayObj->append('dingo');//显示元素个数//echo$arrayObj->count();//对元素进行排序:不区分大小写的自然排序方式,其他排序方式可参考手册$arrayObj->natcasesort();//输入其元素索引删除一个元素$arrayObj->offsetUnset(5);//引入一个元素索引来检测一个元素是否存在if($arrayObj->offsetExists(5)){echo'OffsetExists
';}//改变一个元素的值$arrayObj->offsetSet(3,"pater");//显示某个元素的值Value//echo$arrayObj->offsetGet(4);//替换数组,替换后以这个数组为对象$fruits=array(“柠檬”=>1,“橙子”=>4,“香蕉”=>5,“苹果”=>10);$arrayObj->exchangeArray($fruits);//创建ArrayObject的副本。$copy=$fruitsArrayObject->getArrayCopy();/***遍历数组***/for($iterator=$arrayObj->getIterator();/***检查是否有效***/$iterator->valid();/***移动到下一个数组成员***/$iterator->next()){/***输出键和当前数组值***/echo$iterator->key()。'=>'。$迭代器->当前()。'
';}SplObserver,SplSubject这是设计模式中专门的两个观察者模式的类,在后面的设计模式专题中会详细介绍;简单来说,SplFileInfo是一个对象,封装了一些常用的文件信息功能,比如获取文件的所有权、权限、时间等,具体可以参考:http://php.net/manual/zh/clas...SplFileObjectSplFileObject类为操作文件提供了一个面向对象的接口。具体参考:http://php.net/manual/zh/clas...SplFileObjectextendsSplFileInfoimplementsRecursiveIterator,SeekableIterator{}