PHP中預定義的6種介面解析

來源:互聯網
上載者:User
本文主要介紹了PHP中預定義的6種介面,詳細講解了Traversable、Iterator、IteratorAggregate、ArrayAccess、Serializable、Closure。希望對大家有所協助。

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


以上可以讓一個類實現一個基本的迭代功能,如下可以看到迭代的調用順序:


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


3.IteratorAggregate彙總式迭代器介面

介面摘要:


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


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


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

相關推薦:

php 介面類與抽象類別的實際作用

PHP安全性漫談 php 介面安全 php安全檢測 php.ini安全配

PHP 介面與引用介面詳解_PHP教程

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.