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下使用以下代码连接并测试
Apr 09 PHP
PHP 面向对象 final类与final方法
May 05 PHP
php 抽象类的简单应用
Sep 06 PHP
PHP中空字符串介绍0、null、empty和false之间的关系
Sep 25 PHP
用php随机生成福彩双色球号码的2种方法
Feb 04 PHP
PHP页面实现定时跳转的方法
Oct 31 PHP
PHP生成随机密码方法汇总
Aug 27 PHP
PHP代码判断设备是手机还是平板电脑(两种方法)
Oct 19 PHP
thinkPHP模型初始化实例分析
Dec 03 PHP
使用PHP+AJAX让WordPress动态加载文章的教程
Dec 11 PHP
Laravel框架控制器,视图及模型操作图文详解
Dec 04 PHP
thinkphp5 路由分发原理
Mar 18 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学习笔记 数组的常用函数
2011/06/13 PHP
php中让上传的文件大小在上传前就受限制的两种解决方法
2013/06/24 PHP
PHP内置过滤器FILTER使用实例
2014/06/25 PHP
PHP中的use关键字及文件的加载详解
2016/11/28 PHP
PHP完全二叉树定义与实现方法示例
2017/10/09 PHP
一个对于Array的简单扩展
2006/10/03 Javascript
来自国外的14个图片放大编辑的jQuery插件整理
2010/10/20 Javascript
javascript判断用户浏览器插件安装情况的代码
2011/01/01 Javascript
JS获取地址栏参数的几种方法小结
2014/02/28 Javascript
vuejs 单文件组件.vue 文件的使用
2017/07/28 Javascript
用Vue写一个分页器的示例代码
2018/04/22 Javascript
微信小程序冒泡事件及其阻止方法实例分析
2018/12/06 Javascript
Layui tree 下拉菜单树的实例代码
2019/09/21 Javascript
mpvue微信小程序开发之实现一个弹幕评论
2019/11/24 Javascript
vue实现购物车的监听
2020/04/20 Javascript
Python THREADING模块中的JOIN()方法深入理解
2015/02/18 Python
centos6.4下python3.6.1安装教程
2017/07/21 Python
Python实现破解猜数游戏算法示例
2017/09/25 Python
Python基础教程之利用期物处理并发
2018/03/29 Python
PyTorch中常用的激活函数的方法示例
2019/08/20 Python
TensorFlow tensor的拼接实例
2020/01/19 Python
Python基于百度AI实现OCR文字识别
2020/04/02 Python
利用css3实现的简单的鼠标悬停按钮
2014/11/04 HTML / CSS
CSS3中线性颜色渐变的一些实现方法
2015/07/14 HTML / CSS
Urban Outfitters美国官网:美国生活方式品牌
2016/08/26 全球购物
BONIA官方网站:国际奢侈品牌和皮革专家
2016/11/27 全球购物
美国廉价机票预订网站:Cheapfaremart
2018/04/28 全球购物
英国拖鞋购买网站:Bedroom Athletics
2020/02/28 全球购物
建筑设计师岗位职责
2013/11/18 职场文书
基层党支部公开承诺书
2014/05/29 职场文书
法院干警四风问题个人对照检查材料思想汇报
2014/10/07 职场文书
心灵捕手观后感
2015/06/02 职场文书
红与黑读书笔记
2015/06/29 职场文书
幼儿园开学家长寄语(2016春季)
2015/12/03 职场文书
电力培训学习心得体会
2016/01/11 职场文书
读《解忧杂货店》有感:请相信一切都是最好的安排
2019/11/07 职场文书