PHP中的Iterator迭代对象属性详解


Posted in PHP onApril 12, 2019

前言

foreach用法和之前的数组遍历是一样的,只不过这里遍历的key是属性名,value是属性值。在类外部遍历时,只能遍历到public属性的,因为其它的都是受保护的,类外部不可见。

class HardDiskDrive {

  public $brand;
  public $color;
  public $cpu;
  public $workState;

  protected $memory;
  protected $hardDisk;

  private $price;

  public function __construct($brand, $color, $cpu, $workState, $memory, $hardDisk, $price) {

    $this->brand = $brand;
    $this->color = $color;
    $this->cpu  = $cpu;
    $this->workState = $workState;
    $this->memory = $memory;
    $this->hardDisk = $hardDisk;
    $this->price = $price;
  }

}

$hardDiskDrive = new HardDiskDrive('希捷', 'silver', 'tencent', 'well', '1T', 'hard', '$456');

foreach ($hardDiskDrive as $property => $value) {

  var_dump($property, $value);
  echo '<br>';
}

输出结果为:

string(5) "brand" string(6) "希捷"
string(5) "color" string(6) "silver"
string(3) "cpu" string(7) "tencent"
string(9) "workState" string(4) "well"

通过输出结果我们也可以看得出来常规遍历是无法访问受保护的属性的。

如果我们想遍历出对象的所有属性,就需要控制foreach的行为,就需要给类对象,提供更多的功能,需要继承自Iterator的接口:

该接口,实现了foreach需要的每个操作。foreach的执行流程如下图:

PHP中的Iterator迭代对象属性详解

看图例中,foreach中有几个关键步骤:5个。

而Iterator迭代器中所要求的实现的5个方法,就是用来帮助foreach,实现在遍历对象时的5个关键步骤:

当foreach去遍历对象时, 如果发现对象实现了Ierator接口, 则执行以上5个步骤时, 不是foreach的默认行为, 而是调用对象的对应方法即可:

PHP中的Iterator迭代对象属性详解

示例代码:

class Team implements Iterator {

  //private $name = 'itbsl';
  //private $age = 25;
  //private $hobby = 'fishing';

  private $info = ['itbsl', 25, 'fishing'];

  public function rewind()
  {
    reset($this->info); //重置数组指针
  }

  public function valid()
  {
    //如果为null,表示没有元素,返回false
    //如果不为null,返回true

    return !is_null(key($this->info));
  }

  public function current()
  {
    return current($this->info);
  }

  public function key()
  {
    return key($this->info);
  }

  public function next()
  {
    return next($this->info);
  }

}

$team = new Team();

foreach ($team as $property => $value) {

  var_dump($property, $value);
  echo '<br>';
}

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对三水点靠木的支持。

PHP 相关文章推荐
十天学会php(1)
Oct 09 PHP
一个简单的域名注册情况查询程序
Oct 09 PHP
php抓取https的内容的代码
Apr 06 PHP
php中获取关键词及所属来源搜索引擎名称的代码
Feb 15 PHP
php 代码优化之经典示例
Mar 24 PHP
破解.net程序(dll文件)编译和反编译方法
Jan 31 PHP
php约瑟夫问题解决关于处死犯人的算法
Mar 23 PHP
PHP生成及获取JSON文件的方法
Aug 23 PHP
tp5(thinkPHP5框架)使用DB实现批量删除功能示例
May 28 PHP
PHP 实现文件压缩解压操作的方法
Jun 14 PHP
php swoft框架实例用法
Dec 22 PHP
详解php中流行的rpc框架
May 29 PHP
PHP中str_split()函数的用法讲解
Apr 11 #PHP
PHP远程连接oracle数据库操作实现方法图文详解
Apr 11 #PHP
ThinkPHP5.0框架使用build 自动生成模块操作示例
Apr 11 #PHP
PHP生成随机码的思路与方法实例探索
Apr 11 #PHP
PHP实现网站应用微信登录功能详解
Apr 11 #PHP
PHP之认识(二)关于Traits的用法详解
Apr 11 #PHP
微信公众平台开发教程⑤ 微信扫码支付模式介绍
Apr 10 #PHP
You might like
第十一节--重载
2006/11/16 PHP
PHP调用MsSQL Server 2012存储过程获取多结果集(包含output参数)的详解
2013/07/03 PHP
php中Y2K38的漏洞解决方法实例分析
2014/09/22 PHP
php基于base64解码图片与加密图片还原实例
2014/11/03 PHP
详解PHP的Yii框架的运行机制及其路由功能
2016/03/17 PHP
javascript显示选择目录对话框的代码
2008/11/10 Javascript
JavaScript转换二进制编码为ASCII码的方法
2015/04/16 Javascript
纯js和css完成贪吃蛇小游戏demo
2016/09/01 Javascript
浅谈jQuery中的eq()与DOM中element.[]的区别
2016/10/28 Javascript
Vue动态组件实例解析
2017/08/20 Javascript
webpack学习教程之前端性能优化总结
2017/12/05 Javascript
Angular实现搜索框及价格上下限功能
2018/01/19 Javascript
webpack公共组件引用路径简化小技巧
2018/06/15 Javascript
Angular6中使用Swiper的方法示例
2018/07/09 Javascript
H5+C3+JS实现五子棋游戏(AI篇)
2020/05/28 Javascript
基于AngularJS拖拽插件ngDraggable.js实现拖拽排序功能
2019/04/02 Javascript
vue.js基于v-for实现批量渲染 Json数组对象列表数据示例
2019/08/03 Javascript
JSON stringify方法原理及实例解析
2020/10/23 Javascript
[01:45]DOTA2新英雄“神谕者”全方位展示
2014/11/21 DOTA
python Django批量导入数据
2016/03/25 Python
python实现的AES双向对称加密解密与用法分析
2017/05/02 Python
python逆向入门教程
2018/01/15 Python
Python中字符串与编码示例代码
2019/05/20 Python
Python collections.defaultdict模块用法详解
2020/06/18 Python
HTML5进阶段内联标签汇总(小篇)
2016/07/13 HTML / CSS
美国时尚孕妇装品牌:A Pea in the Pod
2017/07/16 全球购物
Amara德国:家居饰品、设计师品牌和豪华礼品
2019/05/20 全球购物
Lookfantastic阿联酋官网:英国知名美妆护肤购物网站
2020/05/26 全球购物
人事部主管岗位职责
2013/12/26 职场文书
2014年重阳节活动策划方案书
2014/09/16 职场文书
初中生毕业评语
2014/12/29 职场文书
初三英语教学计划
2015/01/23 职场文书
公务员保密工作承诺书
2015/05/04 职场文书
二手房购房意向书
2015/05/09 职场文书
新学期家长寄语2016
2015/12/03 职场文书
SpringRetry重试框架的具体使用
2021/07/25 Java/Android