Welcome 微信登录

首页 / 网页编程 / PHP / PHP中预定义的6种接口介绍

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 "
" ;}
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 "
" ;}
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 (), "
" ;echo $bcl2 (), "
" ;