PHP預定義介面使用學習筆記

來源:互聯網
上載者:User

PHP預定義了6個介面介紹如下:

Traversable 遍曆介面(檢測一個類是否可以使用�0�2foreach�0�2進行遍曆的介面)
Iterator 迭代器介面(可在內部迭代自己的外部迭代器或類的介面)
IteratorAggregate 彙總式迭代器介面(建立外部迭代器的介面)
OuterIterator 迭代器嵌套介面(將一個或多個迭代器包裹在另一個迭代器中)
RecursiveIterator 遞迴迭代提供者(提供遞迴訪問功能)
SeekableIterator 可索引迭代提供者(實現尋找功能)

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

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.