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 相关文章推荐
一个程序下载的管理程序(四)
Oct 09 PHP
在PHP3中实现SESSION的功能(一)
Oct 09 PHP
一个图形显示IP的PHP程序代码
Oct 19 PHP
PHPMyadmin 配置文件详解(配置)
Dec 03 PHP
实测在class的function中include的文件中非php的global全局环境
Jul 15 PHP
codeigniter中实现一次性加载多个view的方法
Mar 20 PHP
php实现的日历程序
Jun 18 PHP
php时间计算相关问题小结
May 09 PHP
php+redis实现多台服务器内网存储session并读取示例
Jan 12 PHP
PHP实现基于图的深度优先遍历输出1,2,3...n的全排列功能
Nov 10 PHP
PHP addcslashes()函数讲解
Feb 03 PHP
PHP数组对象与Json转换操作实例分析
Oct 22 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+DBM的同学录程序(1)
2006/10/09 PHP
浅析php插件 HTMLPurifier HTML解析器
2013/07/01 PHP
DEDECMS首页调用图片集里的多张图片
2015/06/05 PHP
基于ThinkPHP+uploadify+upload+PHPExcel 无刷新导入数据
2015/09/23 PHP
开启PHP的伪静态模式
2015/12/31 PHP
深入浅析Yii admin的权限控制
2016/08/31 PHP
js查找父节点的简单方法
2008/06/28 Javascript
JavaScript 高级语法介绍
2009/06/15 Javascript
NodeJS的url截取模块url-extract的使用实例
2013/11/18 NodeJs
js中confirm实现执行操作前弹出确认框的方法
2014/11/01 Javascript
JavaScript采用递归算法计算阶乘实例
2015/08/04 Javascript
JavaScript DOM 学习总结(五)
2015/11/24 Javascript
javascript嵌套函数和在函数内调用外部函数的区别分析
2016/01/31 Javascript
Angularjs实现带查找筛选功能的select下拉框示例代码
2016/10/04 Javascript
简单模拟node.js中require的加载机制
2016/10/27 Javascript
利用JS判断字符串是否含有数字与特殊字符的方法小结
2016/11/25 Javascript
js实现导航吸顶效果
2017/02/24 Javascript
node通过npm写一个cli命令行工具
2017/10/12 Javascript
微信小程序页面缩放式侧滑效果的实现代码
2018/11/15 Javascript
微信小程序HTTP接口请求封装代码实例
2019/09/05 Javascript
收藏整理的一些Python常用方法和技巧
2015/05/18 Python
Python lxml模块安装教程
2015/06/02 Python
Python实现的生成格雷码功能示例
2018/01/24 Python
代码分析Python地图坐标转换
2018/02/08 Python
Windows 7下Python Web环境搭建图文教程
2018/03/20 Python
ubuntu 18.04搭建python环境(pycharm+anaconda)
2019/06/14 Python
关于ZeroMQ 三种模式python3实现方式
2019/12/23 Python
将世界上最美丽的摄影作品转化为艺术作品:Photos.com
2017/11/28 全球购物
古汉语文学求职信范文
2014/03/16 职场文书
党员2014两会学习心得体会
2014/03/17 职场文书
会计电算化专业求职信
2014/06/10 职场文书
软件测试专业推荐信
2014/09/18 职场文书
授权委托书范本(单位)
2014/09/28 职场文书
简单的个人租房协议书范本
2014/11/26 职场文书
2014年党务公开工作总结
2014/12/09 职场文书
uniapp开发小程序的经验总结
2021/04/08 Javascript