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+javascript液晶时钟
Oct 09 PHP
php设计模式  Command(命令模式)
Jun 17 PHP
DOM XPATH获取img src值的query
Sep 23 PHP
php绘图中显示不出图片的原因及解决
Mar 05 PHP
1亿条数据如何分表100张到Mysql数据库中(PHP)
Jul 29 PHP
Session 失效的原因汇总及解决丢失办法
Sep 30 PHP
php编程每天必学之验证码
Mar 03 PHP
PHP使用curl模拟post上传及接收文件的方法
Mar 04 PHP
ThinkPHP使用Smarty第三方插件方法小结
Mar 19 PHP
解析PHP之提取多维数组指定列的方法
Jan 03 PHP
什么是PHP文件?如何打开PHP文件?
Jun 27 PHP
PHP微信企业号开发之回调模式开启与用法示例
Nov 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
PHP4之COOKIE支持详解
2006/10/09 PHP
无JS,完全php面向过程数据分页实现代码
2012/08/27 PHP
php中操作memcached缓存进行增删改查数据的实现代码
2014/08/15 PHP
详细解读php的命名空间(二)
2018/02/21 PHP
PHP常用函数之格式化时间操作示例
2019/10/21 PHP
js身份证验证超强脚本
2008/10/26 Javascript
JS实现漂亮的窗口拖拽效果(可改变大小、最大化、最小化、关闭)
2015/10/10 Javascript
jquery实现鼠标悬浮停止轮播特效
2020/08/20 Javascript
Bootstrap框架下下拉框select搜索功能
2020/03/26 Javascript
浅谈vue实现数据监听的函数 Object.defineProperty
2017/06/08 Javascript
在vue中通过axios异步使用echarts的方法
2018/01/13 Javascript
JS代码实现电脑配置检测功能
2018/03/21 Javascript
vue实现搜索过滤效果
2019/05/28 Javascript
微信小程序之左右布局的实现代码
2019/12/13 Javascript
JS实现普通轮播图特效
2020/01/01 Javascript
如何通过vscode运行调试javascript代码
2020/07/24 Javascript
[04:16]DOTA2全国高校联赛16强抽签
2018/05/02 DOTA
python中sys.argv参数用法实例分析
2015/05/20 Python
Python函数可变参数定义及其参数传递方式实例详解
2015/05/25 Python
Python面向对象特殊成员
2017/04/24 Python
python 系统调用的实例详解
2017/07/11 Python
Django模板Templates使用方法详解
2019/07/19 Python
python判断一个对象是否可迭代的例子
2019/07/22 Python
CSS3的常见transformation图形变化用法小结
2016/05/13 HTML / CSS
HTML5+CSS设置浮动却没有动反而在中间且错行的问题
2020/05/26 HTML / CSS
澳大利亚领先的在线葡萄酒零售商:Get Wines Direct
2018/03/27 全球购物
全球最大的在线橄榄球商店:Lovell Rugby
2018/05/20 全球购物
行政专员岗位职责
2014/01/02 职场文书
环保专业大学生职业规划设计
2014/01/10 职场文书
婚前财产公证书
2014/04/10 职场文书
银行青年文明号事迹材料
2014/05/31 职场文书
森林病虫害防治方案
2014/06/02 职场文书
驾驶员安全责任书范本
2014/07/24 职场文书
销售顾问工作计划书
2014/08/15 职场文书
工程部文员岗位职责
2015/02/04 职场文书
SQL Server中的逻辑函数介绍
2022/05/25 SQL Server