吸毒的虫子 发表于 2018-12-16 12:39:47

PHP预定义接口介绍

  PHP预定义了6个接口介绍如下:
  1.Traversable遍历接口
  呵呵!其实它不是一个在PHP中可以使用的接口,内部类才可使用,它有一个用途就是检测一个类是否可以遍历。
if($class instanceof Traversable) {    //foreach}  2.Iterator迭代器接口
  接口摘要:
Iterator extends Traversable{      //返回当前索引游标指向的元素      abstract public mixed current(void)      //返回当前索引游标指向的元素的键名      abstract public scalar key(void)      //移动当前索引游标指向下一元素      abstract public void next(void)      //重置索引游标的指向第一个元素      abstract public void rewind(void)      //判断当前索引游标指向的是否是一个元素,常常在调用 rewind()或 next()使用      abstract public boolean valid(void)}  以上可以让一个类实现一个基本的迭代功能,如下可以看到迭代的调用顺序:
classmyIteratorimplementsIterator{    private$position=0 ;    private$array= array(      "firstelement" ,      "secondelement" ,      "lastelement" ,    );   public function__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__ );      return isset( $this -> array [ $this -> position ]);    }} $it= newmyIterator ; foreach( $itas$key=>$value ) {    var_dump ( $key ,$value );    echo"\n" ;}  3.IteratorAggregate聚合式迭代器接口
  接口摘要:
IteratorAggregateextends Traversable{ //获取外部迭代器abstract public Traversable getIterator( void )}  getIterator是一个Iterator或Traversable接口的类的一个实例。如下获取外部迭代器实现迭代访问。
classmyDataimplementsIteratorAggregate{    public$property1="Public property one" ;    public$property2="Public property two" ;    public$property3="Public property three" ;   public function__construct () {      $this -> property4="last property" ;    }         public functiongetIterator () {      return newArrayIterator ( $this );    }} $obj= newmyData ; foreach( $objas$key=>$value ) {    var_dump ( $key ,$value );    echo"\n" ;}  4.ArrayAccess数组式访问接口
  接口摘要:
ArrayAccess{    /* 方法 */    abstract public boolean offsetExists( mixed$offset) //检查偏移位置是否存在    abstract public mixed offsetGet( mixed$offset) //获取一个偏移位置的值    abstract public void offsetSet( mixed$offset, mixed$value) //设置一个偏移位置的值    abstract public void offsetUnset( mixed$offset) //复位一个偏移位置的值}  如下可像访问数组一样访问对象:
classobjimplementsarrayaccess{    private$container= array();    public function__construct () {      $this -> container= array(            "one"    =>1 ,            "two"    =>2 ,            "three"=>3 ,      );    }    public functionoffsetSet ( $offset ,$value ) {      if ( is_null ( $offset )) {            $this -> container [] =$value ;      } else {            $this -> container [ $offset ] =$value ;      }    }    public functionoffsetExists ( $offset ) {      return isset( $this -> container [ $offset ]);    }    public functionoffsetUnset ( $offset ) {      unset( $this -> container [ $offset ]);    }    public functionoffsetGet ( $offset ) {      return isset( $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" ] ="A value" ;var_dump ( $obj [ "two" ]);$obj [] ='Append 1' ;$obj [] ='Append 2' ;$obj [] ='Append 3' ;print_r ( $obj );  5.Serializable序列化接口
  接口摘要:
Serializable{   /* 方法 */    abstract public string serialize( void ) //对象的字符串表示    abstract public mixed unserialize( string $serialized) // 构造对象}  实现该接口的类不再支持__sleep()和__wakeup()。使用很简单,只要序列化对象时serialize方法会被调用,当反序列化时,unserialize方法被调用。
classobjimplementsSerializable{    private$data ;    public function__construct () {      $this -> data="My private data" ;    }    public functionserialize () {      returnserialize ( $this -> data );    }    public functionunserialize ( $data ) {      $this -> data=unserialize ( $data );    }    public functiongetData () {      return$this -> data ;    }} $obj= newobj ;$ser=serialize ( $obj );print_r($ser);$newobj=unserialize ( $ser );print_r($newobj);  6.Closure
  接口摘要:
Closure{    /* 方法 */    __construct( void ) //用于禁止实例化的构造函数    public static Closure bind( Closure$closure, object $newthis[, mixed$newscope= 'static'] ) //复制一个闭包,绑定指定的$this对象和类作用域。    public Closure bindTo( object $newthis[, mixed$newscope= 'static'] ) //复制当前闭包对象,绑定指定的$this对象和类作用域。}classA{    private static$sfoo=1 ;    private$ifoo=2 ;} $cl1= static function() {    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" ;  转载请注明地址: http://www.phpddt.com/php/php-interfaces.html 尊重他人劳动成果就是尊重自己!


页: [1]
查看完整版本: PHP预定义接口介绍