PHP中预定义的6种接口介绍
PHP预定义了6个接口介绍如下:
1.Traversable遍历接口
呵呵!其实它不是一个在PHP中可以使用的接口,内部类才可使用,它有一个用途就是检测一个类是否可以遍历。
if($classinstanceofTraversable){ //foreach }
2.Iterator迭代器接口
接口摘要:
IteratorextendsTraversable { //返回当前索引游标指向的元素 abstractpublicmixedcurrent(void) //返回当前索引游标指向的元素的键名 abstractpublicscalarkey(void) //移动当前索引游标指向下一元素 abstractpublicvoidnext(void) //重置索引游标的指向第一个元素 abstractpublicvoidrewind(void) //判断当前索引游标指向的是否是一个元素,常常在调用rewind()或next()使用 abstractpublicbooleanvalid(void) }
以上可以让一个类实现一个基本的迭代功能,如下可以看到迭代的调用顺序:
classmyIteratorimplementsIterator{ private$position=0; private$array=array( "firstelement", "secondelement", "lastelement", ); publicfunction__construct(){ $this->position=0; } functionrewind(){ var_dump(__METHOD__); $this->position=0; } functioncurrent(){ var_dump(__METHOD__); return$this->array[$this->position]; } functionkey(){ var_dump(__METHOD__); return$this->position; } functionnext(){ var_dump(__METHOD__); ++$this->position; } functionvalid(){ var_dump(__METHOD__); returnisset($this->array[$this->position]); } } $it=newmyIterator; foreach($itas$key=>$value){ var_dump($key,$value); echo"\n"; }
3.IteratorAggregate聚合式迭代器接口
接口摘要:
IteratorAggregateextendsTraversable{ //获取外部迭代器 abstractpublicTraversablegetIterator(void) }
getIterator是一个Iterator或Traversable接口的类的一个实例。如下获取外部迭代器实现迭代访问。
classmyDataimplementsIteratorAggregate{ public$property1="Publicpropertyone"; public$property2="Publicpropertytwo"; public$property3="Publicpropertythree"; publicfunction__construct(){ $this->property4="lastproperty"; } publicfunctiongetIterator(){ returnnewArrayIterator($this); } } $obj=newmyData; foreach($objas$key=>$value){ var_dump($key,$value); echo"\n"; }
4.ArrayAccess数组式访问接口
接口摘要:
ArrayAccess{ /*方法*/ abstractpublicbooleanoffsetExists(mixed$offset)//检查偏移位置是否存在 abstractpublicmixedoffsetGet(mixed$offset)//获取一个偏移位置的值 abstractpublicvoidoffsetSet(mixed$offset,mixed$value)//设置一个偏移位置的值 abstractpublicvoidoffsetUnset(mixed$offset)//复位一个偏移位置的值 }
如下可像访问数组一样访问对象:
classobjimplementsarrayaccess{ private$container=array(); publicfunction__construct(){ $this->container=array( "one"=>1, "two"=>2, "three"=>3, ); } publicfunctionoffsetSet($offset,$value){ if(is_null($offset)){ $this->container[]=$value; }else{ $this->container[$offset]=$value; } } publicfunctionoffsetExists($offset){ returnisset($this->container[$offset]); } publicfunctionoffsetUnset($offset){ unset($this->container[$offset]); } publicfunctionoffsetGet($offset){ returnisset($this->container[$offset])?$this->container[$offset]:null; } } $obj=newobj; var_dump(isset($obj["two"])); var_dump($obj["two"]); unset($obj["two"]); var_dump(isset($obj["two"])); $obj["two"]="Avalue"; var_dump($obj["two"]); $obj[]='Append1'; $obj[]='Append2'; $obj[]='Append3'; print_r($obj);
5.Serializable序列化接口
接口摘要:
Serializable{ /*方法*/ abstractpublicstringserialize(void)//对象的字符串表示 abstractpublicmixedunserialize(string$serialized)//构造对象 }
实现该接口的类不再支持__sleep()和__wakeup()。使用很简单,只要序列化对象时serialize方法会被调用,当反序列化时,unserialize方法被调用。
classobjimplementsSerializable{ private$data; publicfunction__construct(){ $this->data="Myprivatedata"; } publicfunctionserialize(){ returnserialize($this->data); } publicfunctionunserialize($data){ $this->data=unserialize($data); } publicfunctiongetData(){ return$this->data; } } $obj=newobj; $ser=serialize($obj); print_r($ser); $newobj=unserialize($ser); print_r($newobj);
6.Closure
接口摘要:
Closure{ /*方法*/ __construct(void)//用于禁止实例化的构造函数 publicstaticClosurebind(Closure$closure,object$newthis[,mixed$newscope='static'])//复制一个闭包,绑定指定的$this对象和类作用域。 publicClosurebindTo(object$newthis[,mixed$newscope='static'])//复制当前闭包对象,绑定指定的$this对象和类作用域。 }
classA{ privatestatic$sfoo=1; private$ifoo=2; } $cl1=staticfunction(){ returnA::$sfoo; }; $cl2=function(){ return$this->ifoo; }; $bcl1=Closure::bind($cl1,null,'A'); $bcl2=Closure::bind($cl2,newA(),'A'); echo$bcl1(),"\n"; echo$bcl2(),"\n";