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 相关文章推荐
晋城吧对DiscuzX进行的前端优化要点
Sep 05 PHP
phpphp图片采集后按原路径保存图片示例
Feb 18 PHP
php多文件上传实现代码
Feb 20 PHP
PHP 字符串长度判断效率更高的方法
Mar 02 PHP
PHP抓取网页、解析HTML常用的方法总结
Jul 01 PHP
YII Framework框架教程之安全方案详解
Mar 14 PHP
Yii实现的多级联动下拉菜单
Jul 13 PHP
php异步:在php中使用fsockopen curl实现类似异步处理的功能方法
Dec 10 PHP
简单实现php上传文件功能
Sep 21 PHP
PHP实现的简单路由和类自动加载功能
Mar 13 PHP
laravel orm 关联条件查询代码
Oct 21 PHP
让whoops帮我们告别ThinkPHP6的异常页面
Mar 02 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的错误信息
2006/10/09 PHP
谈谈PHP的输入输出流
2007/02/14 PHP
PHP 身份验证方面的函数
2009/10/11 PHP
浅谈php的优缺点
2015/07/14 PHP
利用 fsockopen() 函数开放端口扫描器的实例
2017/08/19 PHP
PHP实现动态压缩js与css文件的方法
2018/05/02 PHP
用jquery ajax获取网站Alexa排名的代码
2009/12/12 Javascript
javascript生成json数据简单示例分享
2014/02/14 Javascript
JavaScript定义变量和变量优先级问题探讨
2014/10/11 Javascript
如何调试异步加载页面里包含的js文件
2014/10/30 Javascript
微信小程序 教程之WXML
2016/10/18 Javascript
JSON中key动态设置及JSON.parse和JSON.stringify()的区别
2016/12/29 Javascript
jQuery Autocomplete简介_动力节点Java学院整理
2017/07/17 jQuery
Angular2里获取(input file)上传文件的内容的方法
2017/09/05 Javascript
详解从Vue.js源码看异步更新DOM策略及nextTick
2017/10/11 Javascript
vue-cli结合Element-ui基于cropper.js封装vue实现图片裁剪组件功能
2018/03/01 Javascript
jQuery 实现批量提交表格多行数据的方法
2018/08/09 jQuery
说说Vue.js中的functional函数化组件的使用
2019/02/12 Javascript
vue项目中使用多选框的实例代码
2020/07/22 Javascript
Python中easy_install 和 pip 的安装及使用
2017/06/05 Python
老生常谈python的私有公有属性(必看篇)
2017/06/09 Python
人工智能最火编程语言 Python大战Java!
2017/11/13 Python
详解python上传文件和字符到PHP服务器
2017/11/24 Python
Django渲染Markdown文章目录的方法示例
2019/01/02 Python
Python实现直播推流效果
2019/11/26 Python
python实现学生管理系统开发
2020/07/24 Python
Python 在局部变量域中执行代码
2020/08/07 Python
英国领先的狗和宠物美容专家:Christies Direct
2017/04/03 全球购物
韩国演唱会订票网站:StubHub韩国
2019/01/17 全球购物
火灾现场处置方案
2014/05/28 职场文书
汽车广告策划方案
2014/05/31 职场文书
幼儿园门卫岗位职责范本
2014/07/02 职场文书
军事理论课感想
2015/08/11 职场文书
Python一行代码实现自动发邮件功能
2021/05/30 Python
matplotlib如何设置坐标轴刻度的个数及标签的方法总结
2021/06/11 Python
MySQL的意向共享锁、意向排它锁和死锁
2022/07/15 MySQL