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 简易输出CSV表格文件的方法详解
Jun 20 PHP
解析php做推送服务端实现ios消息推送
Jul 01 PHP
php中有关字符串的4个函数substr、strrchr、strstr、ereg介绍和使用例子
Apr 24 PHP
php+mysql数据库实现无限分类的方法
Dec 12 PHP
使用PHP实现阻止用户上传成人照片或者裸照
Dec 25 PHP
ThinkPHP 3.2 版本升级了哪些内容
Mar 05 PHP
php计划任务之验证是否有多个进程调用同一个job的方法
Dec 07 PHP
Laravel如何使用数据库事务及捕获事务失败后的异常详解
Oct 23 PHP
php 输出缓冲 Output Control用法实例详解
Mar 03 PHP
PHP程序员简单的开展服务治理架构操作详解(一)
May 14 PHP
php实现的证件照换底色功能示例【人像抠图/换背景图】
May 29 PHP
PHP数组Key强制类型转换实现原理解析
Sep 01 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
关于手调机和数调机的选择
2021/03/02 无线电
PHP中开发XML应用程序之基础篇 添加节点 删除节点 查询节点 查询节
2010/07/09 PHP
PHP通过header实现文本文件下载的代码
2010/08/08 PHP
PHP中uploaded_files函数使用方法详解
2011/03/09 PHP
PHP内核探索之解释器的执行过程
2015/12/22 PHP
PHP针对redis常用操作实例详解
2019/08/17 PHP
js变换显示图片的实例
2013/04/16 Javascript
jquery ready(fn)事件使用介绍
2013/08/21 Javascript
Javascript学习笔记之数组的构造函数
2014/11/23 Javascript
javascript 中null和undefined区分和比较
2017/04/19 Javascript
使用vue-cli打包过程中的步骤以及问题的解决
2018/05/08 Javascript
JS数组去重常用方法实例小结【4种方法】
2018/05/28 Javascript
webpack4 SCSS提取和懒加载的示例
2018/09/03 Javascript
Vue.js+cube-ui(Scroll组件)实现类似头条效果的横向滚动导航条
2019/06/24 Javascript
layui table复选框禁止某几条勾选的实例
2019/09/20 Javascript
用Python写冒泡排序代码
2016/04/12 Python
Python中 Lambda表达式全面解析
2016/11/28 Python
1 行 Python 代码快速实现 FTP 服务器
2018/01/25 Python
Python第三方库face_recognition在windows上的安装过程
2019/05/03 Python
django数据模型(Model)的字段类型解析
2019/12/25 Python
python操作gitlab API过程解析
2019/12/27 Python
Python找出列表中出现次数最多的元素三种方式
2020/02/24 Python
Pytorch使用PIL和Numpy将单张图片转为Pytorch张量方式
2020/05/25 Python
详解pandas.DataFrame.plot() 画图函数
2020/06/14 Python
真正了解CSS3背景下的@font face规则
2017/05/04 HTML / CSS
从零实现一个自定义html5播放器的示例代码
2017/08/01 HTML / CSS
世界领先的电子书网站:eBooks.com(在线购买小说、非小说和教科书)
2019/03/30 全球购物
西部世纪面试题
2014/12/05 面试题
Ajax的工作原理
2015/12/04 面试题
室内设计专业学生的自我评价分享
2013/11/27 职场文书
自荐信写法介绍
2014/01/25 职场文书
大龄毕业生求职别忘职业规划
2014/03/11 职场文书
搞笑老公保证书
2015/02/26 职场文书
银行稽核岗位职责
2015/04/13 职场文书
MySQL七大JOIN的具体使用
2022/02/28 MySQL
【海涛DOTA解说】EVE女子战队独家录像加ZSMJ神牛两连发
2022/04/01 DOTA