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 相关文章推荐
在Windows版的PHP中使用ADO
Oct 09 PHP
fleaphp常用方法分页之Pager使用方法
Apr 23 PHP
thinkphp3.0 模板中函数的使用
Nov 13 PHP
PHP实现多进程并行操作的详解(可做守护进程)
Jun 18 PHP
PHP图片自动裁切应付不同尺寸的显示
Oct 16 PHP
PHP内存缓存Memcached类实例
Dec 08 PHP
WordPress用户登录框密码的隐藏与部分显示技巧
Dec 31 PHP
PHP常见漏洞攻击分析
Feb 21 PHP
php基于curl重写file_get_contents函数实例
Nov 08 PHP
php基于SQLite实现的分页功能示例
Jun 21 PHP
PHP实现限制IP访问及提交次数的方法详解
Jul 17 PHP
PHP asXML()函数讲解
Feb 03 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
两种php调用Java对象的方法
2006/10/09 PHP
PHP中的float类型使用说明
2010/07/27 PHP
php中$美元符号与Zen Coding冲突问题解决方法分享
2014/05/28 PHP
ThinkPHP发送邮件示例代码
2016/10/08 PHP
php判断str字符串是否是xml格式数据的方法示例
2017/07/26 PHP
thinkPHP中钩子的使用方法实例分析
2017/11/16 PHP
php实现微信分享朋友链接功能
2019/02/18 PHP
javascript 极速 隐藏/显示万行表格列只需 60毫秒
2009/03/28 Javascript
javascript 主动派发事件总结
2011/08/09 Javascript
jquery高级编程的最佳实践详解
2014/03/23 Javascript
实现音乐播放器的代码(html5+css3+jquery)
2015/08/04 Javascript
封装的dialog插件 基于bootstrap模态对话框的简单扩展
2016/08/10 Javascript
javascript字符串对象常用api函数小结(连接,替换,分割,转换等)
2016/09/20 Javascript
微信小程序教程之本地图片上传(leancloud)实例详解
2016/11/16 Javascript
关于Vue.js 2.0的Vuex 2.0 你需要更新的知识库
2016/11/30 Javascript
浅谈js-FCC算法Friendly Date Ranges(详解)
2017/04/10 Javascript
Bootstrap fileinput文件上传预览插件使用详解
2017/05/16 Javascript
vue项目中vue-i18n和element-ui国际化开发实现过程
2018/04/25 Javascript
JS中‘hello’与new String(‘hello’)引出的问题详解
2018/08/14 Javascript
微信小程序实现点击图片旋转180度并且弹出下拉列表
2018/11/27 Javascript
[48:38]DOTA2亚洲邀请赛 3.31 小组赛 B组 Mineski vs Secret
2018/03/31 DOTA
[03:17]DOTA2-DPC中国联赛1月29日Recap集锦
2021/03/11 DOTA
教你用 Python 实现微信跳一跳(Mac+iOS版)
2018/01/04 Python
Face++ API实现手势识别系统设计
2018/11/21 Python
python3.7中安装paddleocr及paddlepaddle包的多种方法
2020/11/27 Python
canvas绘制文本内容自动换行的实现代码
2019/01/14 HTML / CSS
HTML5 Canvas旋转动画的2个代码例子(一个旋转的太极图效果)
2014/04/10 HTML / CSS
Python如何实现单例模式
2016/06/03 面试题
应届护士推荐信
2013/11/16 职场文书
留学推荐信写作指南
2014/01/25 职场文书
中学生操行评语
2014/04/24 职场文书
法制宣传口号
2014/06/16 职场文书
加班费申请报告
2015/05/15 职场文书
2016年共产党员公开承诺书
2016/03/24 职场文书
PHP对接阿里云虚拟号的实现(号码隐私保护)
2021/04/06 PHP
在K8s上部署Redis集群的方法步骤
2021/04/27 Redis