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 相关文章推荐
检测png图片是否完整的php代码
Sep 06 PHP
Laravel框架学习笔记(二)项目实战之模型(Models)
Oct 15 PHP
PHP中你应该知道的require()文件包含的正确用法
Jun 12 PHP
用PHP生成excel文件到指定目录
Jun 22 PHP
php实现点击可刷新验证码
Nov 07 PHP
PHP获取redis里不存在的6位随机数应用示例【设置24小时过时】
Jun 07 PHP
PHP如何获取当前主机、域名、网址、路径、端口等参数
Jun 09 PHP
详解thinkphp中的volist标签
Jan 15 PHP
PHP实现微信对账单处理
Oct 01 PHP
PHP实现的策略模式示例
Mar 20 PHP
php设计模式之职责链模式定义与用法经典示例
Sep 19 PHP
PHP迭代器和生成器用法实例分析
Sep 28 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后台程序与Javascript的两种交互方式
2009/10/25 PHP
PHP字符串和十六进制如何实现互相转换
2020/07/16 PHP
JavaScript 变量基础知识
2009/11/07 Javascript
百度移动版的url编码解码示例
2014/04/29 Javascript
js中window.open打开一个新的页面
2014/08/10 Javascript
JS鼠标拖拽实例分析
2015/11/23 Javascript
jQuery实现两列等高并自适应高度
2016/12/22 Javascript
JS实现的数字格式化功能示例
2017/02/10 Javascript
react.js CMS 删除功能的实现方法
2017/04/17 Javascript
JavaScript实现重力下落与弹性效果的方法分析
2017/12/20 Javascript
vue 实现的树形菜的实例代码
2018/03/19 Javascript
JS实现移动端触屏拖拽功能
2018/07/31 Javascript
react 应用多入口配置及实践总结
2018/10/17 Javascript
浅析vue 函数配置项watch及函数 $watch 源码分享
2018/11/22 Javascript
Nuxt.js开启SSR渲染的教程详解
2018/11/30 Javascript
详解vue项目中调用百度地图API使用方法
2019/04/25 Javascript
vue给对象动态添加属性和值的实例
2019/09/09 Javascript
vue axios封装httpjs,接口公用配置拦截操作
2020/08/11 Javascript
Python读取图片EXIF信息类库介绍和使用实例
2014/07/10 Python
Python实现CET查分的方法
2015/03/10 Python
Python3.x中自定义比较函数
2015/04/24 Python
浅谈使用Python内置函数getattr实现分发模式
2018/01/22 Python
在python环境下运用kafka对数据进行实时传输的方法
2018/12/27 Python
python实现简单聊天室功能 可以私聊
2019/07/12 Python
python函数不定长参数使用方法解析
2019/12/14 Python
numpy矩阵数值太多不能全部显示的解决
2020/05/14 Python
Python嵌入C/C++进行开发详解
2020/06/09 Python
英国护肤品购物网站:Beauty Expert
2016/08/19 全球购物
幼儿园园长自我鉴定
2013/10/22 职场文书
影视动画专业个人的自我评价
2013/12/31 职场文书
大二学习计划书范文
2014/04/27 职场文书
小学开学标语
2014/07/01 职场文书
幼儿园六一儿童节活动方案
2014/08/26 职场文书
为自己工作观后感
2015/06/11 职场文书
Python pandas求方差和标准差的方法实例
2021/08/04 Python
Python编程super应用场景及示例解析
2021/10/05 Python