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最常用的ini函数分析 针对PHP.ini配置文件
Apr 22 PHP
windows下开发并编译PHP扩展的方法
Mar 18 PHP
ThinkPHP实现将本地文件打包成zip下载
Jun 26 PHP
WordPress迁移时一些常见问题的解决方法整理
Nov 24 PHP
Zend Framework框架Smarty扩展实现方法
Mar 22 PHP
php自定义函数实现汉字转换utf8编码的方法
Sep 29 PHP
php获取远程图片并下载保存到本地的方法分析
Oct 08 PHP
浅谈PHP的反射机制
Dec 15 PHP
php+redis实现商城秒杀功能
Nov 19 PHP
php从数据库读取数据,并以json格式返回数据的方法
Aug 21 PHP
Windows服务器中PHP如何安装redis扩展
Sep 27 PHP
laravel5.2表单验证,并显示错误信息的实例
Sep 29 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
IIS下PHP连接数据库提示mysql undefined function mysql_connect()
2010/06/04 PHP
php使用GeoIP库实例
2014/06/27 PHP
php实现异步数据调用的方法
2015/12/24 PHP
PHP的Yii框架中过滤器相关的使用总结
2016/03/29 PHP
浅谈PHP正则中的捕获组与非捕获组
2016/07/18 PHP
php 根据自增id创建唯一编号类
2017/04/06 PHP
PHP下载文件函数与用法示例
2019/09/27 PHP
获取HTML DOM节点元素的方法的总结
2009/08/21 Javascript
jQuery学习基础知识小结
2010/11/25 Javascript
nodeJS代码实现计算交社保是否合适
2015/03/09 NodeJs
JS实现的简洁纵向滑动菜单(滑动门)效果
2015/10/19 Javascript
Bootstrap每天必学之导航条
2015/11/27 Javascript
Angularjs实现mvvm式的选项卡示例代码
2016/09/08 Javascript
微信小程序 页面滑动事件的实例详解
2017/10/12 Javascript
Vue项目查看当前使用的elementUI版本的方法
2018/09/27 Javascript
Vue父子组件之间的通信实例详解
2018/09/28 Javascript
微信小程序实用代码段(收藏版)
2019/12/17 Javascript
微信小程序开发打开另一个小程序的实现方法
2020/05/17 Javascript
支付宝小程序实现省市区三级联动
2020/06/21 Javascript
vue等两个接口都返回结果再执行下一步的实例
2020/09/08 Javascript
JavaScript 如何计算文本的行数的实现
2020/09/14 Javascript
[00:32]2018DOTA2亚洲邀请赛出场——LGD
2018/04/04 DOTA
python构建深度神经网络(DNN)
2018/03/10 Python
python 筛选数据集中列中value长度大于20的数据集方法
2018/06/14 Python
详解python3中的真值测试
2018/08/13 Python
Python3实现爬虫爬取赶集网列表功能【基于request和BeautifulSoup模块】
2018/12/05 Python
用python画一只可爱的皮卡丘实例
2019/11/21 Python
Python单元测试及unittest框架用法实例解析
2020/07/09 Python
python 绘制国旗的示例
2020/09/27 Python
如何使用 Flask 做一个评论系统
2020/11/27 Python
英国羊皮鞋类领先品牌:Just Sheepskin
2019/12/12 全球购物
如何将一个描述日期或日期/时间的字符串转换为一个Date对象
2015/10/13 面试题
教师辞职报告范文
2014/01/20 职场文书
学生党员批评与自我批评
2014/10/15 职场文书
请假条应该怎么写?
2019/06/24 职场文书
如何用JS实现网页瀑布流布局
2021/04/24 Javascript