侯体宗的博客
  • 首页
  • 人生(杂谈)
  • 技术
  • 关于我
  • 更多分类
    • 文件下载
    • 文字修仙
    • 中国象棋ai
    • 群聊
    • 九宫格抽奖
    • 拼图
    • 消消乐
    • 相册

PHP之预定义接口详解

php  /  管理员 发布于 7年前   140

在PHP中有好几个预定义的接口,比较常用的四个接口(IteratorAggregate(聚合式aggregate迭代器Iterator)、Countable、ArrayAccess、Iterator)分别给大家详细介绍下。

IteratorAggregate(聚合式aggregate迭代器Iterator)接口


复制代码 代码如下:

IteratorAggregate extends Traversable {
 abstract public Traversable getIterator(void)
}

这个接口实现了一个功能――创建外部迭代器,具体怎么理解呢,当我们使用foreach对对象进行便遍历的时候,如果没有继承IteratorAggregate接口,遍历的是对象中所有的public属性(只能是public $var这种形式)。要是继承了IteratorAggregate,会使用类中实现的getIterator方法返回的对象,这里要注意返回的一定要是一个Traversable对象或者扩展自Traversable的对象,否则会抛出异常

 

//看个例子class My{ private $_data = [ 'a' => '燕睿涛', 'b' => 'yanruitao', 'c' => 'LULU', ];  public function getIterator() { return new ArrayIterator($this->_data); }}$obj = new My;foreach ($obj as $key => $value) { echo "$key => $value\n";}//输出结果为空 class My implements IteratorAggregate { private $_data = [ 'a' => '燕睿涛', 'b' => 'yanruitao', 'c' => 'LULU', ]; public function getIterator() { return new ArrayIterator($this->_data); }}$obj = new My;foreach ($obj as $key => $value) { echo "$key => $value\n";}//结果:a => 燕睿涛b => yanruitaoc => LULU

Countable接口

复制代码 代码如下:

Countable {
 abstract public int count(void)
}

这个接口用于统计对象的数量,具体怎么理解呢,当我们对一个对象调用count的时候,如果函数没有继承Countable将一直返回1,如果继承了Countable会返回所实现的count方法所返回的数字,看看下面的例子:

class CountMe{  protected $_myCount = 3;  public function count()  {  return $this->_myCount;  } } $countable = new CountMe(); echo count($countable);//返回1class CountMe implements Countable{  protected $_myCount = 3;  public function count()  {  return $this->_myCount;  } } $countable = new CountMe(); echo count($countable); //返回3ArrayAccess接口ArrayAccess { abstract public boolean offsetExists(mixed $offset) abstract public mixed offsetGet(mixed $offset) public void offsetSet(mixed $offset, mixed $value) public void offsetUnset(mixed $offset)}class CountMe{  protected $_myCount = 3;  public function count()  {   return $this->_myCount;  } } $countable = new CountMe(); echo count($countable);//返回1class CountMe implements Countable{  protected $_myCount = 3;  public function count()  {   return $this->_myCount;  } } $countable = new CountMe(); echo count($countable); //返回3

ArrayAccess接口

复制代码 代码如下:

ArrayAccess {
 abstract public boolean offsetExists(mixed $offset)
    abstract public mixed offsetGet(mixed $offset)
    public void offsetSet(mixed $offset, mixed $value)
    public void offsetUnset(mixed $offset)
}

这个接口的作用是让我们可以像访问数组一样访问对象,这个怎么说好呢,我猜其实就是php在词法分析的时候如果碰到了数组的方式使用对象,就回去对象中查找是否有实现ArrayAccess如果有的话,进行对应的操作(set、unset、isset、get),这样我们就可以在类里面放置一个array,让类实现数组方式的基本操作,下面看个例子:

class myObj{ }$obj = new myObj;$obj['name'];//Fatal error: Cannot use object of type myObj as array in class myObj implements ArrayAccess { public function offsetSet($offset, $value) {  echo "offsetSet : {$offset} => {$value}\n"; } public function offsetExists($offset) {  echo "offsetExists : {$offset}\n"; } public function offsetUnset($offset) {  echo "offsetUnset : {$offset}\n"; } public function offsetGet($offset) {  echo "offsetGet : {$offset}\n"; }}$obj = new myObj;$obj[1] = '燕睿涛';isset($obj['name']);unset($obj['name']);$obj['yrt'];//输出结果:offsetSet : 1 => 燕睿涛offsetExists : nameoffsetUnset : nameoffsetGet : yrtclass myObj implements ArrayAccess { private $_data = []; public function offsetSet($offset, $value) {  $this->_data[$offset] = $value; } public function offsetExists($offset) {  return isset($this->_data[$offset]); } public function offsetUnset($offset) {  unset($this->_data[$offset]); } public function offsetGet($offset) {  return $this->_data[$offset]; }}$obj = new myObj;$obj['yrt'] = '燕睿涛';var_dump($obj['yrt']);var_dump(isset($obj['yrt']));unset($obj['yrt']);var_dump(isset($obj['yrt']));var_dump($obj['yrt']);//输出:string(9) "燕睿涛"bool(true)bool(false)Notice: Undefined index: yrt //最后一个会报出Notice

上面的对象只能是基本的数组操作,连遍历都不行,结合之前的IteratorAggregate可以进行foreach:

class myObj implements ArrayAccess, IteratorAggregate{private $_data = []; public function getIterator() {  return new ArrayIterator($this->_data); } ......}$obj = new myObj;$obj['yrt'] = '燕睿涛';$obj[1] = '燕睿涛';$obj['name'] = '燕睿涛';$obj['age'] = 23;foreach ($obj as $key => $value) { echo "{$key} => {$value}\n";}//输出:yrt => 燕睿涛1 => 燕睿涛name => 燕睿涛age => 23

Iterator接口:


复制代码 代码如下:

Iterator extends Traversable {
    abstract public mixed current(void)
    abstract public scalar key(void)
    abstract public void next(void)
    abstract public void rewind(void)
    abstract public boolean valid(void)
}

可在内部迭代自己的外部迭代器或类的接口,这是官方文档给出的解释,看着还是不好理解,其实我感觉这个接口实现的功能和trratorAggregate(文档:创建外部迭代器接口,接口直接返回一个迭代器)类似,不过这个在类的定义里面自己实现了,看个例子:

class myObj implements Iterator{ private $_data = []; public function __construct(Array $arr) { $this->_data = $arr; } public function current() { return current($this->_data); } public function key() { return key($this->_data); } public function next() { next($this->_data); } public function rewind() { reset($this->_data); } public function valid() { return $this->key() !== NULL; }}$t = [ 'yrt' => '燕睿涛', 'name' => '燕睿涛', false, '燕睿涛'];$obj = new myObj($t);foreach ($obj as $key => $value) { echo "{$key} => ".var_export($value, true)."\n";}//输出:yrt => '燕睿涛'name => '燕睿涛'0 => false1 => '燕睿涛'


上面这个参考了鸟哥的一篇文章关于一笔试题(Iterator模式),不过鸟哥的那个判断valid有点瑕疵,当碰到值北来就是false的时候就会截断


总结
说了这么多好像还是没有体会到他们的用处,建议看看Yii2的源码,源码里面大量使用了这些东西,看了之后,你会慢慢觉得“哦~好像还真是挺有用的。。。。”

以上就是本文全部介绍,希望大家喜欢。

您可能感兴趣的文章:

  • PHP迭代器接口Iterator用法分析
  • PHP迭代器的内部执行过程详解
  • PHP迭代器实现斐波纳契数列的函数
  • php 接口类与抽象类的实际作用
  • php接口和抽象类使用示例详解
  • php接口与接口引用的深入解析
  • 深入分析php中接口与抽象类的区别
  • PHP面向对象的进阶学习(抽像类、接口、final、类常量)
  • PHP接口并发测试的方法(推荐)
  • PHP中用接口、抽象类、普通基类实现“面向接口编程”与“耦合方法”简述
  • php多重接口的实现方法
  • PHP聚合式迭代器接口IteratorAggregate用法分析


  • 上一条:
    PHP简单生成缩略图相册的方法
    下一条:
    PHP实现的迷你漂流瓶
  • 昵称:

    邮箱:

    0条评论 (评论内容有缓存机制,请悉知!)
    最新最热
    • 分类目录
    • 人生(杂谈)
    • 技术
    • linux
    • Java
    • php
    • 框架(架构)
    • 前端
    • ThinkPHP
    • 数据库
    • 微信(小程序)
    • Laravel
    • Redis
    • Docker
    • Go
    • swoole
    • Windows
    • Python
    • 苹果(mac/ios)
    • 相关文章
    • Laravel从Accel获得5700万美元A轮融资(0个评论)
    • PHP 8.4 Alpha 1现已发布!(0个评论)
    • 用Time Warden监控PHP中的代码处理时间(0个评论)
    • 在PHP中使用array_pop + yield实现读取超大型目录功能示例(0个评论)
    • Property Hooks RFC在PHP 8.4中越来越接近现实(0个评论)
    • 近期文章
    • 在windows10中升级go版本至1.24后LiteIDE的Ctrl+左击无法跳转问题解决方案(0个评论)
    • 智能合约Solidity学习CryptoZombie第四课:僵尸作战系统(0个评论)
    • 智能合约Solidity学习CryptoZombie第三课:组建僵尸军队(高级Solidity理论)(0个评论)
    • 智能合约Solidity学习CryptoZombie第二课:让你的僵尸猎食(0个评论)
    • 智能合约Solidity学习CryptoZombie第一课:生成一只你的僵尸(0个评论)
    • 在go中实现一个常用的先进先出的缓存淘汰算法示例代码(0个评论)
    • 在go+gin中使用"github.com/skip2/go-qrcode"实现url转二维码功能(0个评论)
    • 在go语言中使用api.geonames.org接口实现根据国际邮政编码获取地址信息功能(1个评论)
    • 在go语言中使用github.com/signintech/gopdf实现生成pdf分页文件功能(95个评论)
    • gmail发邮件报错:534 5.7.9 Application-specific password required...解决方案(0个评论)
    • 近期评论
    • 122 在

      学历:一种延缓就业设计,生活需求下的权衡之选中评论 工作几年后,报名考研了,到现在还没认真学习备考,迷茫中。作为一名北漂互联网打工人..
    • 123 在

      Clash for Windows作者删库跑路了,github已404中评论 按理说只要你在国内,所有的流量进出都在监控范围内,不管你怎么隐藏也没用,想搞你分..
    • 原梓番博客 在

      在Laravel框架中使用模型Model分表最简单的方法中评论 好久好久都没看友情链接申请了,今天刚看,已经添加。..
    • 博主 在

      佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 @1111老铁这个不行了,可以看看近期评论的其他文章..
    • 1111 在

      佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 网站不能打开,博主百忙中能否发个APP下载链接,佛跳墙或极光..
    • 2016-10
    • 2016-11
    • 2017-06
    • 2017-07
    • 2017-08
    • 2017-09
    • 2017-11
    • 2017-12
    • 2018-01
    • 2018-02
    • 2018-03
    • 2020-03
    • 2020-04
    • 2020-05
    • 2020-06
    • 2020-07
    • 2020-09
    • 2021-02
    • 2021-03
    • 2021-04
    • 2021-05
    • 2021-06
    • 2021-07
    • 2021-08
    • 2021-09
    • 2021-10
    • 2021-11
    • 2021-12
    • 2022-01
    • 2022-02
    • 2022-05
    • 2022-06
    • 2022-07
    • 2022-08
    • 2022-09
    • 2022-10
    • 2022-11
    • 2022-12
    • 2023-01
    • 2023-02
    • 2023-03
    • 2023-04
    • 2023-05
    • 2023-06
    • 2023-07
    • 2023-08
    • 2023-09
    • 2023-10
    • 2023-11
    • 2023-12
    • 2024-01
    • 2024-02
    • 2024-03
    • 2024-04
    • 2024-05
    • 2024-06
    • 2024-07
    • 2024-09
    Top

    Copyright·© 2019 侯体宗版权所有· 粤ICP备20027696号 PHP交流群

    侯体宗的博客