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聊天室技术
Oct 09 PHP
php实现的MySQL通用查询程序
Mar 11 PHP
Discuz 模板语句分析及知识技巧
Aug 21 PHP
深入了解 register_globals (附register_globals=off 网站打不开的解决方法)
Jun 27 PHP
根据中文裁减字符串函数的php代码
Dec 03 PHP
ThinkPHP采用原生query实现关联查询left join实例
Dec 02 PHP
PHP图像处理类库MagickWand用法实例分析
May 21 PHP
在Laravel框架里实现发送邮件实例(邮箱验证)
May 20 PHP
Yii框架结合sphinx,Ajax实现搜索分页功能示例
Oct 18 PHP
php使用curl实现简单模拟提交表单功能
May 15 PHP
Ubuntu 16.04中Laravel5.4升级到5.6的步骤
Dec 07 PHP
laravel 5.5 关闭token的3种实现方式
Oct 24 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
用php获取本周,上周,本月,上月,本季度日期的代码
2009/08/05 PHP
php 传值赋值与引用赋值的区别
2010/12/29 PHP
解析thinkphp的左右值无限分类
2013/06/20 PHP
解析php file_exists无效的解决办法
2013/06/26 PHP
javascript 写类方式之三
2009/07/05 Javascript
基于jquery实现的上传图片及图片大小验证、图片预览效果代码
2011/04/12 Javascript
js 通用javascript函数库整理
2011/08/14 Javascript
JQuery制作的放大效果的popup对话框(未添加任何jquery plugin)分享
2013/04/28 Javascript
JS封装cookie操作函数实例(设置、读取、删除)
2015/11/17 Javascript
详解利用jsx写vue组件的方法示例
2017/07/17 Javascript
Vue.js简易安装和快速入门(第二课)
2017/10/17 Javascript
JavaScript 中定义函数用 var foo = function () {} 和 function foo()区别介绍
2018/03/01 Javascript
详解mpvue小程序中怎么引入iconfont字体图标
2018/10/01 Javascript
jquery层次选择器的介绍
2019/01/18 jQuery
在Layui中操作数据表格,给指定单元格添加事件示例
2019/10/26 Javascript
使用python实现baidu hi自动登录的代码
2013/02/10 Python
进一步探究Python中的正则表达式
2015/04/28 Python
解读Python中degrees()方法的使用
2015/05/18 Python
深入浅析Python字符编码
2015/11/12 Python
python定向爬虫校园论坛帖子信息
2018/07/23 Python
PyTorch中Tensor的拼接与拆分的实现
2019/08/18 Python
Python自动化测试笔试面试题精选
2020/03/12 Python
如何理解python中数字列表
2020/05/29 Python
使用keras实现Precise, Recall, F1-socre方式
2020/06/15 Python
10款最佳Python开发工具推荐,每一款都是神器
2020/10/15 Python
Python爬虫之Selenium中frame/iframe表单嵌套页面
2020/12/04 Python
python爬取抖音视频的实例分析
2021/01/19 Python
CSS3实现彩色进度条动画的示例
2020/10/29 HTML / CSS
瑞典轮胎在线:Tirendo.se
2018/06/21 全球购物
巴西补充剂和维生素购物网站:Natue
2019/06/17 全球购物
生产经理的自我评价分享
2013/11/07 职场文书
中医专业应届生求职信
2013/11/17 职场文书
小学校园活动策划
2014/01/30 职场文书
2015年青年志愿者协会工作总结
2015/04/27 职场文书
教学反思怎么写
2016/02/24 职场文书
python字符串的多行输出的实例详解
2021/06/08 Python