PHP预约义接口使用学习笔记ca88会员登录中心,PHP中预约义的6种接口介绍

ca88会员登录中心

PHP预订义了6个接口介绍如下:

PHP预约义了6个接口介绍如下:

迭代器或类的接口。

1.Traversable遍历接口

pse: collapse; background-color: rgb(255, 255, 255);
-webkit-text-stroke-width: 0px;”>

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)  
} 

呵呵!其实它不是多少个在PHP中得以利用的接口,内部类才可应用,它有三个用途就是检查实验三个类是或不是能够遍历。

Traversable

scalar 规范变量 整型、字符串、浮点型等

if($class instanceof Traversable) {
  //foreach
}

遍历接口(检查评定三个类是或不是足以应用�0�2foreach�0�2举办遍历的接口)

$a="hello word";
$obj=(object)$a;
echo $obj->scalar;
//输出 "hello word"

class myIterator implements Iterator {
    private $position = 0;
    private $array = array(
            "firstelement",
            "secondelement",
            "lastelement",
    );

    public function __construct() {
        $this->position = 0;
    }

    function rewind() {
//         var_dump(__METHOD__);
        $this->position = 0;
    }

    function current() {
//         var_dump(__METHOD__);
        return $this->array[$this->position];
    }

    function key() {
//         var_dump(__METHOD__);
        return $this->position;
    }

    function next() {
//         var_dump(__METHOD__);
        ++$this->position;
    }

    function valid() {
//         var_dump(__METHOD__);
        return isset($this->array[$this->position]);
    }
}

$it = new myIterator;

foreach($it as $key => $value) {
    echo "{$key}|{$value}";
    echo "\n";    
}

2.Iterator迭代器接口

Iterator

出口结果:

接口摘要:

迭代器接口(可在里头迭代自身的外界迭代器或类的接口)

0|firstelement
1|secondelement
2|lastelement
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) 
} 

IteratorAggregate

Traversable 预约义接口

如上能够让二个类达成二个主导的迭代效率,如下能够看出迭代的调用顺序:

聚合式迭代器接口(创设外界迭代器的接口)

Traversable {

class myIterator implements Iterator {
  private $position = 0 ;
  private $array = array(
    "firstelement" ,
    "secondelement" ,
    "lastelement" ,
  );

  public function __construct () {
    $this -> position = 0 ;
  }

  function rewind () {
    var_dump ( __METHOD__ );
    $this -> position = 0 ;
  }

  function current () {
    var_dump ( __METHOD__ );
    return $this -> array [ $this -> position ];
  }

  function key () {
    var_dump ( __METHOD__ );
    return $this -> position ;
  }

  function next () {
    var_dump ( __METHOD__ );
    ++ $this -> position ;
  }

  function valid () {
    var_dump ( __METHOD__ );
    return isset( $this -> array [ $this -> position ]);
  }
}

$it = new myIterator ;

foreach( $it as $key => $value ) {
  var_dump ( $key , $value );
  echo "\n" ;
}

OuterIterator

}

3.IteratorAggregate聚合式迭代器接口

迭代器嵌套接口(将一个或四个迭代器包裹在另贰个迭代器中)

意义:检查评定二个类是还是不是能够运用 foreach 举行遍历的接口。
php代码中无法用。独有个中的PHP类(用C写的类)才得以一贯促成Traversable接口

接口摘要:

RecursiveIterator

IteratorAggregate
预订义接口(对Iterator的嘱托)

IteratorAggregate extends Traversable {

//获取外部迭代器
abstract public Traversable getIterator ( void )
} 

递归迭代访谈接口(提供递归访问成效)

class myDataArray implements IteratorAggregate {
    private $_d = array('a','b','c','d');

    public function __construct() {
        $this->_d[] =   "last property";
    }

    public function getIterator() {
        return new ArrayIterator($this->_d);
    }
}

$obj = new myDataArray;

foreach($obj as $key => $value) {
    var_dump($key, $value);
    echo "\n";
}

getIterator是一个Iterator或Traversable接口的类的三个实例。如下获取外界迭代器达成迭代访谈。

SeekableIterator

ArrayAccess

class myData implements IteratorAggregate {
  public $property1 = "Public property one" ;
  public $property2 = "Public property two" ;
  public $property3 = "Public property three" ;

  public function __construct () {
    $this -> property4 = "last property" ;
  }


  public function getIterator () {
    return new ArrayIterator ( $this );
  }
}

$obj = new myData ;

foreach( $obj as $key => $value ) {
  var_dump ( $key , $value );
  echo "\n" ;
}

可索引迭代访谈接口(达成查找成效)

PHP的ArrayAccess接口 像数组一样来探问你的PHP对象

4.ArrayAccess数组式访谈接口

1.Traversable遍历接口

class Test implements ArrayAccess {

    private $elements;

    public function offsetExists($offset){
        return isset($this->elements[$offset]);
    }

    public function offsetSet($offset, $value){
        $this->elements[$offset] = $value;
    }

    public function offsetGet($offset){
        return $this->elements[$offset];
    }

    public function offsetUnset($offset){
        unset($this->elements[$offset]);
    }
}

$test = new Test();
$test['test'] = 'test';//自动调用offsetSet
if(isset($test['test']))//自动调用offsetExists
{
    echo $test['test'];//自动调用offsetGet
    echo '<br />';
    unset($test['test']);//自动调用offsetUnset
    var_dump($test['test']);
}

Lararel中常常使用比如$this['config']

接口摘要:

呵呵!其实它不是贰个在PHP中能够利用的接口,内部类才可使用,它有二个用场便是检验八个类是不是可以遍历。

SeekableIterator 预订义接口

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 ) //复位一个偏移位置的值
}

if($class instanceof Traversable) {
    //foreach
}

对接口Iterator的扩展
在接口中能够 seek

如下可像访问数组同样访谈对象:

 2.Iterator迭代器接口

SeekableIterator extends Iterator {
/* 方法 */
abstract public void seek ( int $position )
/* 继承的方法 */
abstract public mixed Iterator::current ( void )
abstract public scalar Iterator::key ( void )
abstract public void Iterator::next ( void )
abstract public void Iterator::rewind ( void )
abstract public boolean Iterator::valid ( void )
class obj implements arrayaccess {
  private $container = array();
  public function __construct () {
    $this -> container = array(
      "one"  => 1 ,
      "two"  => 2 ,
      "three" => 3 ,
    );
  }
  public function offsetSet ( $offset , $value ) {
    if ( is_null ( $offset )) {
      $this -> container [] = $value ;
    } else {
      $this -> container [ $offset ] = $value ;
    }
  }
  public function offsetExists ( $offset ) {
    return isset( $this -> container [ $offset ]);
  }
  public function offsetUnset ( $offset ) {
    unset( $this -> container [ $offset ]);
  }
  public function offsetGet ( $offset ) {
    return isset( $this -> container [ $offset ]) ? $this -> container [ $offset ] : null ;
  }
}

$obj = new obj ;

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

接口摘要:
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) 
}

Serializable

5.Serializable系列化接口

 

增加接口,对类类别化就是对类内对应方法数据体系反种类化

接口摘要:

如上能够让二个类落成贰个为主的迭代功效,如下能够看到迭代的调用顺序:

class obj implements Serializable {
    private $data;
    public function __construct() {
        $this->data = ["My private data"];
    }
    public function serialize() {
        return serialize($this->data);
    }
    public function unserialize($data) {
        $this->data = unserialize($data);
    }
    public function getData() {
        return $this->data;
    }
}

$obj = new obj;
$ser = serialize($obj);

$newobj = unserialize($ser);

var_dump($newobj->getData());
Serializable {

  /* 方法 */
  abstract public string serialize ( void ) //对象的字符串表示
  abstract public mixed unserialize ( string $serialized ) // 构造对象
}

class  myIterator  implements  Iterator  {
    private  $position  =  0 ;
    private  $array  = array(
        “firstelement” ,
        “secondelement” ,
        “lastelement” ,
    );
 
    public function  __construct () {
        $this -> position  =  0 ;
    }
 
    function  rewind () {
        var_dump ( __METHOD__ );
        $this -> position  =  0 ;
    }
 
    function  current () {
        var_dump ( __METHOD__ );
        return  $this -> array [ $this -> position ];
    }
 
    function  key () {
        var_dump ( __METHOD__ );
        return  $this -> position ;
    }
 
    function  next () {
        var_dump ( __METHOD__ );
        ++ $this -> position ;
    }
 
    function  valid () {
        var_dump ( __METHOD__ );
        return isset( $this -> array [ $this -> position ]);
    }
}
 
$it  = new  myIterator ;
 
foreach( $it  as  $key  =>  $value ) {
    var_dump ( $key ,  $value );
    echo  “\n” ;
}

Countable

实现该接口的类不再协助__sleep()和__wakeup()。使用不会细小略,只要体系化对象时serialize方法会被调用,当反系列化时,unserialize方法被调用。

3.IteratorAggregate聚合式迭代器接口

可见对目的完毕count操作

class obj implements Serializable {
  private $data ;
  public function __construct () {
    $this -> data = "My private data" ;
  }
  public function serialize () {
    return serialize ( $this -> data );
  }
  public function unserialize ( $data ) {
    $this -> data = unserialize ( $data );
  }
  public function getData () {
    return $this -> data ;
  }
}

$obj = new obj ;
$ser = serialize ( $obj );
print_r($ser);
$newobj = unserialize ( $ser );
print_r($newobj);

接口摘要:

class  Basket implements Countable{
    private $fruits =array('apple','banna','pear','orange','watermelon');
    public function count(){
        return count($this->fruits);
    }
}
$basket = new Basket();
var_dump(count($basket));

6.Closure
接口摘要:

IteratorAggregate  extends Traversable  {
 
//获取外界迭代器
abstract public Traversable getIterator  ( void )
}

Closure {
  /* 方法 */
  __construct ( void ) //用于禁止实例化的构造函数
  public static Closure bind ( Closure $closure , object $newthis [, mixed $newscope = 'static' ] ) //复制一个闭包,绑定指定的$this对象和类作用域。
  public Closure bindTo ( object $newthis [, mixed $newscope = 'static' ] ) //复制当前闭包对象,绑定指定的$this对象和类作用域。
}



class A {
  private static $sfoo = 1 ;
  private $ifoo = 2 ;
}
 $cl1 = static function() {
  return A :: $sfoo ;
};
 $cl2 = function() {
  return $this -> ifoo ;
};

 $bcl1 = Closure :: bind ( $cl1 , null , 'A' );
 $bcl2 = Closure :: bind ( $cl2 , new A (), 'A' );
echo $bcl1 (), "\n" ;
echo $bcl2 (), "\n" ;

getIterator是叁个Iterator或Traversable接口的类的一个实例。如下获取外界迭代器实现迭代访问。
class  myData  implements  IteratorAggregate  {
    public  $property1  =  “Public property one” ;
    public  $property2  =  “Public property two” ;
    public  $property3  =  “Public property three” ;
 
    public function  __construct () {
        $this -> property4  =  “last property” ;
    }
 
   
    public function  getIterator () {
        return new  ArrayIterator ( $this );
    }
}
 
$obj  = new  myData ;
 
foreach( $obj  as  $key  =>  $value ) {
    var_dump ( $key ,  $value );
    echo  “\n” ;
}

你只怕感兴趣的篇章:

  • C#使用IHttpModule接口修改http输出的措施
  • PHP生成json和xml类型接口数据格式
  • C#中落到实处决断某些类是还是不是落到实处了有些接口
  • C#中类与接口的区分个人总计
  • C#中的ICustomFormatter及IFormatProvider接口用法揭秘
  • C#显式地达成接口成员的艺术
  • 通过C#兑现自动售货机接口

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  )
//重新恢复设置贰个偏移地方的值
}

如下可像访问数组同样访谈对象:
class  obj  implements  arrayaccess  {
    private  $container  = array();
    public function  __construct () {
        $this -> container  = array(
            “one”    =>  1 ,
            “two”    =>  2 ,
            “three”  =>  3 ,
        );
    }
    public function  offsetSet ( $offset ,  $value ) {
        if ( is_null ( $offset )) {
            $this -> container [] =  $value ;
        } else {
            $this -> container [ $offset ] =  $value ;
        }
    }
    public function  offsetExists ( $offset ) {
        return isset( $this -> container [ $offset ]);
    }
    public function  offsetUnset ( $offset ) {
        unset( $this -> container [ $offset ]);
    }
    public function  offsetGet ( $offset ) {
        return isset( $this -> container [ $offset ]) ?  $this
-> container [ $offset ] :  null ;
    }
}
 
$obj  = new  obj ;
 
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方法被调用。

class  obj  implements  Serializable  {
    private  $data ;
    public function  __construct () {
        $this -> data  =  “My private data” ;
    }
    public function  serialize () {
        return  serialize ( $this -> data );
    }
    public function  unserialize ( $data ) {
        $this -> data  =  unserialize ( $data );
    }
    public function  getData () {
        return  $this -> data ;
    }
}
 
$obj  = new  obj ;
$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对象和类功能域。
}

class  A  {
    private static  $sfoo  =  1 ;
    private  $ifoo  =  2 ;
}
 $cl1  = static function() {
    return  A :: $sfoo ;
};
 $cl2  = function() {
    return  $this -> ifoo ;
};
 
 $bcl1  =  Closure :: bind ( $cl1 ,  null ,  ‘A’ );
 $bcl2  =  Closure :: bind ( $cl2 , new  A (),  ‘A’ );
echo  $bcl1 (),  “\n” ;
echo  $bcl2 (),  “\n” ;

发表评论

电子邮件地址不会被公开。 必填项已用*标注

网站地图xml地图