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";