PHP基于SPL实现的迭代器模式示例


Posted in PHP onApril 22, 2018

本文实例讲述了PHP基于SPL实现的迭代器模式。分享给大家供大家参考,具体如下:

现在有这么两个类,Department部门类、Employee员工类:

//部门类
class Department{
  private $_name;
  private $_employees;
  function __construct($name){
    $this->_name = $name;
    $this->employees = array();
  }
  function addEmployee(Employee $e){
    $this->_employees[] = $e;
    echo "员工{$e->getName()}被分配到{$this->_name}中去";
  }
}
//员工类
class Employee{
  private $_name;
  function __construct($name){
    $this->_name = $name;
  }
  function getName(){
    return $this->_name;
  }
}
//应用:
$lsgo = new Department('LSGO实验室');
$e1 = new Employee("小锦");
$e2 = new Employee("小猪");
$lsgo->addEmployee($e1);
$lsgo->addEmployee($e2);

好了,现在LSGO实验室已经有两个部员了,现在我想把全部的部员都列出来,就是用循环来获取部门的每个员工的详情。

在这里我们用PHP中的SPL标准库提供的迭代器来实现。

《大话设计模式》中如是说:

迭代器模式:迭代器模式是遍历集合的成熟模式,迭代器模式的关键是将遍历集合的任务交给一个叫做迭代器的对象,它的工作时遍历并选择序列中的对象,而客户端程序员不必知道或关心该集合序列底层的结构。

迭代器模式的作用简而言之:是使所有复杂数据结构的组件都可以使用循环来访问

假如我们的对象要实现迭代,我们使这个类实现 Iterator(SPL标准库提供),这是一个迭代器接口,为了实现该接口,我们必须实现以下方法:

current(),该函数返回当前数据项
key(),该函数返回当前数据项的键或者该项在列表中的位置
next(),该函数使数据项的键或者位置前移
rewind(),该函数重置键值或者位置
valid(),该函数返回 bool 值,表明当前键或者位置是否指向数据值

实现了 Iterator 接口和规定的方法后,PHP就能够知道该类类型的对象需要迭代。

我们使用这种方式重构 Department 类:

class Department implements Iterator
{
  private $_name;
  private $_employees;
  private $_position;//标志当前数组指针位置
  function __construct($name)
  {
    $this->_name = $name;
    $this->employees = array();
    $this->_position = 0;
  }
  function addEmployee(Employee $e)
  {
    $this->_employees[] = $e;
    echo "员工{$e->getName()}被分配到{$this->_name}中去";
  }
  //实现 Iterator 接口要求实现的方法
  function current()
  {
    return $this->_employees[$this->_position];
  }
  function key()
  {
    return $this->_position;
  }
  function next()
  {
    $this->_position++;
  }
  function rewind()
  {
    $this->_position = 0;
  }
  function valid()
  {
    return isset($this->_employees[$this->_position]);
  }
}
//Employee 类同前
//应用:
$lsgo = new Department('LSGO实验室');
$e1 = new Employee("小锦");
$e2 = new Employee("小猪");
$lsgo->addEmployee($e1);
$lsgo->addEmployee($e2);
echo "LSGO实验室部员情况:";
//这里其实遍历的$_employee
foreach($lsgo as $val){
  echo "部员{$val->getName()}";
}

附加:

假如现在我们想要知道该部门有几个员工,如果是数组的话,一个 count() 函数就 ok 了,那么我们能不能像上面那样把对象当作数组来处理?SPL标准库中提供了 Countable 接口供我们使用:

class Department implements Iterator,Countable{
  //前面同上
  //实现Countable中要求实现的方法
  function count(){
    return count($this->_employees);
  }
}
//应用:
echo "员工数量:";
echo count($lsgo);

本文参考自《深入理解PHP高级技巧、面向对象与核心技术》

希望本文所述对大家PHP程序设计有所帮助。

PHP 相关文章推荐
玩转虚拟域名◎+ .
Oct 09 PHP
php中通过正则表达式下载内容中的远程图片的函数代码
Jan 10 PHP
php shell超强免杀、减少体积工具实现代码
Oct 16 PHP
Codeigniter框架实现获取分页数据和总条数的方法
Dec 05 PHP
PHP实现采集抓取淘宝网单个商品信息
Jan 08 PHP
php+xml实现在线英文词典查询的方法
Jan 23 PHP
PHP文件上传、客户端和服务器端加限制、抓取错误信息、完整步骤解析
Jan 12 PHP
基于Laravel实现的用户动态模块开发
Sep 21 PHP
php依赖注入知识点详解
Sep 23 PHP
laravel请求参数校验方法
Oct 10 PHP
Laravel服务容器绑定的几种方法总结
Jun 14 PHP
Swoole源码中如何查询Websocket的连接问题详解
Aug 30 PHP
PHP生成推广海报的方法分享
Apr 22 #PHP
PHP排序算法之归并排序(Merging Sort)实例详解
Apr 21 #PHP
PHP排序算法之快速排序(Quick Sort)及其优化算法详解
Apr 21 #PHP
Laravel模型间关系设置分表的方法示例
Apr 21 #PHP
PHP排序算法之基数排序(Radix Sort)实例详解
Apr 21 #PHP
PHP排序算法之堆排序(Heap Sort)实例详解
Apr 21 #PHP
PHP实现Huffman编码/解码的示例代码
Apr 20 #PHP
You might like
PHP模板引擎Smarty内建函数详解
2016/04/11 PHP
再谈ie和firefox下的document.all属性
2009/10/21 Javascript
再论Javascript的类继承
2011/03/05 Javascript
Jquery动态进行图片缩略的原理及实现
2013/08/13 Javascript
JS 新增Cookie 取cookie值 删除cookie 举例详解
2014/10/10 Javascript
jQuery过滤HTML标签并高亮显示关键字的方法
2015/08/07 Javascript
实例解析js中try、catch、finally的执行规则
2017/02/24 Javascript
JS+HTML5 FileReader对象用法示例
2017/04/07 Javascript
使用AngularJS对表单提交内容进行验证的操作方法
2017/07/12 Javascript
vue页面加载闪烁问题的解决方法
2018/03/28 Javascript
微信小程序登录时如何获取input框中的内容
2019/12/04 Javascript
vue 获取url参数、get参数返回数组的操作
2020/11/12 Javascript
[04:11]2014DOTA2国际邀请赛 CIS遗憾出局梦想不灭
2014/07/09 DOTA
[55:32]2018DOTA2亚洲邀请赛 4.4 淘汰赛 EG vs LGD 第二场
2018/04/05 DOTA
[42:23]完美世界DOTA2联赛PWL S3 Forest vs Rebirth 第二场 12.10
2020/12/13 DOTA
用Python制作简单的朴素基数估计器的教程
2015/04/01 Python
Python实现的数据结构与算法之链表详解
2015/04/22 Python
Python中处理字符串之isalpha()方法的使用
2015/05/18 Python
Python的Scrapy爬虫框架简单学习笔记
2016/01/20 Python
Python操作mysql数据库实现增删查改功能的方法
2018/01/15 Python
详解如何用django实现redirect的几种方法总结
2018/11/22 Python
python的几种矩阵相乘的公式详解
2019/07/10 Python
python matplotlib如何给图中的点加标签
2019/11/14 Python
Django封装交互接口代码
2020/07/12 Python
html5 canvas实现圆形时钟代码分享
2013/12/25 HTML / CSS
Champion官网:美国冠军运动服装
2017/01/25 全球购物
娇韵诗加拿大官网:Clarins加拿大
2017/11/20 全球购物
营销与策划应届生求职信
2013/11/04 职场文书
迟到检讨书300字
2014/02/14 职场文书
影视广告专业求职信
2014/09/02 职场文书
中华在我心中演讲稿
2014/09/13 职场文书
趣味运动会广播稿
2014/09/13 职场文书
向国旗敬礼活动总结范文2014
2014/09/27 职场文书
公司员工管理制度
2015/08/04 职场文书
2016年国庆节假期旅游工作总结
2016/04/01 职场文书
《孙子兵法》:欲成大事者,需读懂这些致胜策略
2019/08/23 职场文书