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程序--记数器
Oct 09 PHP
php excel类 phpExcel使用方法介绍
Aug 21 PHP
解析smarty模板中类似for的功能实现
Jun 18 PHP
PHP 解决session死锁的方法
Jun 20 PHP
朋友网关于QQ相关的PHP代码(研究QQ的绝佳资料)
Jan 26 PHP
PHP数组相关函数汇总
Mar 24 PHP
PHP XML和数组互相转换详解
Oct 26 PHP
PHP实现根据数组的值进行分组的方法
Apr 20 PHP
PHP读取并输出XML文件数据的简单实现方法
Dec 22 PHP
PHP删除数组中指定下标的元素方法
Feb 03 PHP
Yii2.0实现的批量更新及批量插入功能示例
Jan 29 PHP
laravel框架中间件简单使用方法示例
Jan 25 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做的端口嗅探器--可以指定网站和端口
2006/10/09 PHP
在Mac OS上搭建PHP的Yii框架及相关测试环境
2016/02/14 PHP
Yii框架使用魔术方法实现跨文件调用功能示例
2017/05/20 PHP
jscript之List Excel Color Values
2007/06/13 Javascript
js chrome浏览器判断代码
2010/03/28 Javascript
基于Jquery的淡入淡出的特效基础练习
2010/12/13 Javascript
javascript模块化是什么及其优缺点介绍
2013/09/02 Javascript
jQuery异步验证用户名是否存在示例代码
2014/05/21 Javascript
JavaScript拆分字符串时产生空字符的解决方案
2014/09/26 Javascript
简介JavaScript中的push()方法的使用
2015/06/09 Javascript
javaScript生成支持中文带logo的二维码(jquery.qrcode.js)
2017/01/03 Javascript
MUI 解决动态列表页图片懒加载再次加载不成功的bug问题
2017/04/13 Javascript
微信JS SDK接入的几点注意事项(必看篇)
2017/06/23 Javascript
iview给radio按钮组件加点击事件的实例
2017/09/30 Javascript
vue-star评星组件开发实例
2018/03/01 Javascript
VUE 实现滚动监听 导航栏置顶的方法
2018/09/11 Javascript
详解JavaScript 新语法之Class 的私有属性与私有方法
2019/04/23 Javascript
使用Vue.observable()进行状态管理的实例代码详解
2019/05/26 Javascript
vue中watch的用法汇总
2020/12/28 Vue.js
[17:36]VG战队纪录片
2014/08/21 DOTA
Python交换变量
2008/09/06 Python
Python中使用filter过滤列表的一个小技巧分享
2020/05/02 Python
30行Python代码实现高分辨率图像导航的方法
2020/05/22 Python
解决pip install psycopg2出错问题
2020/07/09 Python
Python单元测试及unittest框架用法实例解析
2020/07/09 Python
Python绘图之二维图与三维图详解
2020/08/04 Python
CSS3实现渐变背景兼容问题
2020/05/06 HTML / CSS
项目考察欢迎辞
2014/01/17 职场文书
2014年消防工作实施方案
2014/02/20 职场文书
关于祖国的演讲稿
2014/05/04 职场文书
师范生自荐信模板
2014/05/28 职场文书
城市规划应届毕业生自荐信
2014/07/04 职场文书
学校百日安全生产活动总结
2014/07/05 职场文书
2014年图书馆个人工作总结
2014/12/18 职场文书
2015年店长工作总结范文
2015/04/08 职场文书
JS前端可扩展的低代码UI框架Sunmao使用详解
2022/07/23 Javascript