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的FTP学习(三)
Oct 09 PHP
php+mysql实现无限级分类 | 树型显示分类关系
Nov 19 PHP
.htaccess文件保护实例讲解
Feb 06 PHP
php中通过curl模拟登陆discuz论坛的实现代码
Feb 16 PHP
基于PHP常用字符串的总结(待续)
Jun 07 PHP
解析smarty 截取字符串函数 truncate的用法介绍
Jun 20 PHP
PHP error_log()将错误信息写入一个文件(定义和用法)
Oct 25 PHP
ThinkPHP实现将SESSION存入MYSQL的方法
Jul 22 PHP
PHP工程师VIM配置分享
Dec 15 PHP
Zend Framework框架Smarty扩展实现方法
Mar 22 PHP
php数组函数array_walk用法示例
May 26 PHP
Yii框架实现多数据库配置和操作的方法
May 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通过数组实现多条件查询实现方法(字符串分割)
2014/05/06 PHP
Yii2中datetime类的使用
2016/12/17 PHP
Laravel + Elasticsearch 实现中文搜索的方法
2020/02/02 PHP
jQuery :nth-child前有无空格的区别分析
2011/07/11 Javascript
一个简单的JS鼠标悬停特效具体方法
2013/06/17 Javascript
Javascript/Jquery——简单定时器的多种实现方法
2013/07/03 Javascript
jQuery中多个元素的Hover事件解决方案
2014/06/12 Javascript
jquery实现经典的淡入淡出选项卡效果代码
2015/09/22 Javascript
SublimeText自带格式化代码功能之reindent
2015/12/27 Javascript
Bootstrap树形组件jqTree的简单封装
2016/01/25 Javascript
Uploadify上传文件方法
2016/03/16 Javascript
js实现数组去重方法及效率?Ρ? target=
2017/02/14 Javascript
详解微信开发中snsapi_base和snsapi_userinfo及静默授权的实现
2017/03/11 Javascript
详解angular2实现ng2-router 路由和嵌套路由
2017/03/24 Javascript
完美解决mui框架off-canvas侧滑超出部分隐藏无法滚动的问题
2018/01/25 Javascript
JavaScript生成指定范围的时间列表
2018/03/19 Javascript
JavaScript引用类型Date常见用法实例分析
2018/08/08 Javascript
vue自定义表单生成器form-create使用详解
2019/07/19 Javascript
通过实例了解Javascript柯里化流程
2020/03/03 Javascript
jQuery实现简单QQ聊天框
2020/08/27 jQuery
[40:17]2018DOTA2亚洲邀请赛 4.5 淘汰赛 LGD vs Liquid 第一场
2018/04/06 DOTA
Python中的多重装饰器
2015/04/11 Python
python中pandas.DataFrame对行与列求和及添加新行与列示例
2017/03/12 Python
详解Python基础random模块随机数的生成
2019/03/23 Python
python实现BP神经网络回归预测模型
2019/08/09 Python
Python 使用生成器代替线程的方法
2020/08/04 Python
Python 操作 MySQL数据库
2020/09/18 Python
Charlotte Tilbury美国官网:英国美妆品牌
2017/10/13 全球购物
锐步英国官网:Reebok英国
2019/11/29 全球购物
remote接口和home接口主要作用
2013/05/15 面试题
技校生自我鉴定范文
2013/09/26 职场文书
助人为乐好少年事迹材料
2014/08/18 职场文书
尊老爱幼演讲稿
2014/09/04 职场文书
Python打包exe时各种异常处理方案总结
2021/05/18 Python
Pytest中skip和skipif的具体使用方法
2021/06/30 Python
Apache SeaTunnel实现 非CDC数据抽取
2022/05/20 Servers