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动态生成VRML网页
Oct 09 PHP
php中文本操作的类
Mar 17 PHP
基于PHP5魔术常量与魔术方法的详解
Jun 13 PHP
PHP遍历某个目录下的所有文件和子文件夹的实现代码
Jun 28 PHP
PHP中数组定义的几种方法
Sep 01 PHP
2014过年倒计时示例
Jan 31 PHP
php中动态调用函数的方法
Mar 16 PHP
php实现网站留言板功能
Nov 04 PHP
php中final关键字用法分析
Dec 07 PHP
PHP生成图片验证码功能示例
Jan 12 PHP
支持汉转拼和拼音分词的PHP中文工具类ChineseUtil
Feb 23 PHP
PHP 判断字符串是中文还是英文, 或者是中英混合
Mar 09 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制作的意见反馈表源码
2007/03/11 PHP
PHP 第二节 数据类型之数组
2012/04/28 PHP
解析php框架codeigniter中如何使用框架的session
2013/06/24 PHP
PHP校验15位和18位身份证号的类封装
2018/11/07 PHP
YII框架http缓存操作示例
2019/04/29 PHP
JavaScript入门教程 Cookies
2009/01/31 Javascript
js arguments.callee的应用代码
2009/05/07 Javascript
JQuery 应用 JQuery.groupTable.js
2010/12/15 Javascript
js给网页加上背景音乐及选择音效的方法
2015/03/03 Javascript
详解javascript传统方法实现异步校验
2016/01/22 Javascript
js实现上传文件添加和删除文件选择框
2016/10/24 Javascript
canvas实现图像放大镜
2017/02/06 Javascript
详解webpack+es6+angular1.x项目构建
2017/05/02 Javascript
jQuery实现简单的手风琴效果
2020/04/17 jQuery
jQuery实现导航栏头部菜单项点击后变换颜色的方法
2017/07/19 jQuery
Vue插槽原理与用法详解
2019/03/05 Javascript
简单了解微信小程序的目录结构
2019/07/01 Javascript
JavaScript页面加载事件实例讲解
2019/09/01 Javascript
JavaScript判断浏览器版本的方法
2019/11/03 Javascript
python实现dict版图遍历示例
2014/02/19 Python
Python sys.argv用法实例
2015/05/28 Python
详解分布式任务队列Celery使用说明
2018/11/29 Python
Python基于matplotlib画箱体图检验异常值操作示例【附xls数据文件下载】
2019/01/07 Python
Python3分析处理声音数据的例子
2019/08/27 Python
Python接口开发实现步骤详解
2020/04/26 Python
python 批量将中文名转换为拼音
2021/02/07 Python
CSS3教程(7):CSS3嵌入字体
2009/04/02 HTML / CSS
CSS3制作彩色进度条样式的代码示例分享
2016/06/23 HTML / CSS
Html5在手机端调用相机的方法实现
2020/05/13 HTML / CSS
英国最大的奢侈珠宝和手表网站:C W Sellors
2017/02/10 全球购物
用你熟悉的语言写一个连接ORACLE数据库的程序,能够完成修改和查询工作
2012/06/11 面试题
介绍一下游标
2012/01/10 面试题
文秘专业个人求职信
2013/12/22 职场文书
医德医风个人工作总结2014
2014/11/14 职场文书
PL350与SW11的比较
2021/04/22 无线电
用python删除文件夹中的重复图片(图片去重)
2021/05/12 Python