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 DOS攻击实现代码(附如何防范)
May 29 PHP
解析php多线程下载远程多个文件
Jun 25 PHP
下拉列表多级联动dropDownList示例代码
Jun 27 PHP
使用PHPExcel操作Excel用法实例分析
Mar 26 PHP
PHP时间和日期函数详解
May 08 PHP
Laravel手动分页实现方法详解
Oct 09 PHP
PHP中include和require的区别实例分析
May 07 PHP
PHP PDO操作MySQL基础教程
Jun 05 PHP
PHP实现验证码校验功能
Nov 16 PHP
PHP-FPM 的管理和配置详解
Feb 17 PHP
php+Ajax处理xml与json格式数据的方法示例
Mar 04 PHP
PHP生成二维码与识别二维码的方法详解【附源码下载】
Mar 07 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/06/14 PHP
PHP比你想象的好得多
2014/11/27 PHP
CI框架中数据库操作函数$this-&gt;db-&gt;where()相关用法总结
2016/05/17 PHP
javascript json 新手入门文档
2009/12/03 Javascript
jQuery EasyUI API 中文文档 - Documentation 文档
2011/09/29 Javascript
Bootstrap进度条组件知识详解
2016/05/01 Javascript
js 调用百度分享功能
2017/02/27 Javascript
JSONP跨域请求
2017/03/02 Javascript
JavaScript实现星星等级评价功能
2017/03/22 Javascript
HTML的select控件美化
2017/03/27 Javascript
JS条形码(一维码)插件JsBarcode用法详解【编码类型、参数、属性】
2017/04/19 Javascript
js 原生判断内容区域是否滚动到底部的实例代码
2017/11/15 Javascript
Vue2仿淘宝实现省市区三级联动
2020/04/15 Javascript
js序列化和反序列化的使用讲解
2019/01/19 Javascript
详解在网页上通过JS实现文本的语音朗读
2019/03/28 Javascript
vscode中的vue项目报错Property ‘xxx‘ does not exist on type ‘CombinedVueInstance<{ readyOnly...Vetur(2339)
2020/09/11 Javascript
[02:40]2018年度DOTA2最佳新人-完美盛典
2018/12/16 DOTA
python正则表达式判断字符串是否是全部小写示例
2013/12/25 Python
Python中字典(dict)和列表(list)的排序方法实例
2014/06/16 Python
Python读取一个目录下所有目录和文件的方法
2016/07/15 Python
python中类变量与成员变量的使用注意点总结
2017/04/29 Python
带你了解python装饰器
2017/06/15 Python
详解Python自建logging模块
2018/01/29 Python
python实现图书借阅系统
2019/02/20 Python
python数据预处理 :数据共线性处理详解
2020/02/24 Python
在Windows上安装和配置 Jupyter Lab 作为桌面级应用程序教程
2020/04/22 Python
Python 如何查找特定类型文件
2020/08/17 Python
Python爬取酷狗MP3音频的步骤
2021/02/26 Python
CSS3近阶段篇之酷炫的3D旋转透视
2016/04/28 HTML / CSS
大学竞选班干部演讲稿
2014/08/21 职场文书
单位委托书格式范本
2014/09/29 职场文书
惹女朋友生气检讨书
2015/05/06 职场文书
详解Laravel制作API接口
2021/05/31 PHP
深入理解python协程
2021/06/15 Python
使用Redis做预定库存缓存功能
2022/04/02 Redis
MySQL中的全表扫描和索引树扫描
2022/05/15 MySQL