PHP中预定义的6种接口介绍


Posted in PHP onMay 12, 2015

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生成静态页面的简单示例
Apr 17 PHP
Yii框架form表单用法实例
Dec 04 PHP
使用PHP实现阻止用户上传成人照片或者裸照
Dec 25 PHP
php绘图之生成饼状图的方法
Jan 24 PHP
php实现插入数组但不影响原有顺序的方法
Mar 27 PHP
php获取、检查类名、函数名、方法名的函数方法
Jun 25 PHP
php数组分页实现方法
Apr 30 PHP
php gd等比例缩放压缩图片函数
Jun 12 PHP
Docker 如何布置PHP开发环境
Jun 21 PHP
THINKPHP截取中文字符串函数实例代码
Mar 20 PHP
PHP长连接实现与使用方法详解
Feb 11 PHP
Laravel中正确地返回HTTP状态码方法示例
Sep 10 PHP
迪菲-赫尔曼密钥交换(Diffie?Hellman)算法原理和PHP实现版
May 12 #PHP
PHP 反射(Reflection)使用实例
May 12 #PHP
PHP Reflection API详解
May 12 #PHP
php通过curl模拟登陆DZ论坛
May 11 #PHP
PHP中的魔术方法总结和使用实例
May 11 #PHP
php基于curl扩展制作跨平台的restfule 接口
May 11 #PHP
PHP SPL标准库中的常用函数介绍
May 11 #PHP
You might like
收集的DedeCMS一些使用经验
2007/03/17 PHP
ThinkPHP的RBAC(基于角色权限控制)深入解析
2013/06/17 PHP
php截取视频指定帧为图片
2016/05/16 PHP
浅谈thinkphp5 instance 的简单实现
2017/07/30 PHP
jQuery1.6 使用方法一
2011/11/23 Javascript
优化Jquery,提升网页加载速度
2013/11/14 Javascript
jquery ajax传递中文参数乱码问题及解决方法说明
2014/02/07 Javascript
JS生成不重复随机数组的函数代码
2014/06/10 Javascript
Nodejs学习笔记之入门篇
2015/04/16 NodeJs
jquery关于事件冒泡和事件委托的技巧及阻止与允许事件冒泡的三种实现方法
2015/11/27 Javascript
原生 JS Ajax,GET和POST 请求实例代码
2016/06/08 Javascript
Bootstrap中data-target 到底是什么
2017/02/14 Javascript
vue组件watch属性实例讲解
2017/11/07 Javascript
vue通过点击事件读取音频文件的方法
2018/05/30 Javascript
在vue中使用echars实现上浮与下钻效果
2019/11/08 Javascript
解决vue自定义全局消息框组件问题
2019/11/22 Javascript
你准备好迎接vue3.0了吗
2020/04/28 Javascript
js实现浏览器打印功能的示例代码
2020/07/15 Javascript
js实现鼠标拖曳效果
2020/12/30 Javascript
在IPython中执行Python程序文件的示例
2018/11/01 Python
python 图像平移和旋转的实例
2019/01/10 Python
详谈tensorflow gfile文件的用法
2020/02/05 Python
css3实现蒙版弹幕功能
2019/06/18 HTML / CSS
瑞典Happy Socks美国官网:购买色彩斑斓的快乐袜子
2016/10/19 全球购物
中国电子产品外贸网站:MiniIntheBox
2017/02/06 全球购物
廉价航班、机票和酒店:JustFly
2018/02/07 全球购物
波兰家居饰品和厨房配件网上商店:Maleomi
2020/12/15 全球购物
洗煤厂厂长岗位职责
2014/01/03 职场文书
献爱心活动总结
2014/05/07 职场文书
单位实习工作证明怎么写
2014/11/02 职场文书
教师节慰问信
2015/02/15 职场文书
2015年学校信息技术工作总结
2015/05/25 职场文书
《平移和旋转》教学反思
2016/02/19 职场文书
职场中的你,辞职信写对了吗?
2019/06/26 职场文书
浅谈怎么给Python添加类型标注
2021/06/08 Python
MySQL 亿级数据导入导出及迁移笔记
2021/06/18 MySQL