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程序中的常见漏洞进行攻击(上)
Oct 09 PHP
linux下使用ThinkPHP需要注意大小写导致的问题
Aug 02 PHP
php curl 伪造IP来源的实例代码
Nov 01 PHP
php判断是否为json格式的方法
Mar 04 PHP
PHP图像处理类库及演示分享
May 17 PHP
php判断表是否存在的方法
Jun 18 PHP
Yii2.0实现生成二维码功能实例
Oct 24 PHP
php+redis消息队列实现抢购功能
Feb 08 PHP
PHP命名空间简单用法示例
Dec 28 PHP
laravel 实现登陆后返回登陆前的页面方法
Oct 03 PHP
PHP unset函数原理及使用方法解析
Aug 14 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
利用中国天气预报接口实现简单天气预报
2014/01/20 PHP
分享一个php 的异常处理程序
2014/06/22 PHP
WordPress中编写自定义存储字段的相关PHP函数解析
2015/12/25 PHP
PHP递归删除多维数组中的某个值
2017/04/17 PHP
PHP异常处理定义与使用方法分析
2017/07/25 PHP
php curl简单采集图片生成base64编码(并附curl函数参数说明)
2019/02/15 PHP
RGB颜色值转HTML十六进制(HEX)代码的JS函数
2009/04/25 Javascript
基于jquery+thickbox仿校内登录注册框
2010/06/07 Javascript
javascript获取选中的文本的方法代码
2013/10/30 Javascript
jquery设置text的值示例(设置文本框 DIV 表单值)
2014/01/06 Javascript
程序员必知35个jQuery 代码片段
2015/11/05 Javascript
JavaScript获取浏览器信息的方法
2015/11/20 Javascript
JS使用正则表达式过滤多个词语并替换为相同长度星号的方法
2016/08/03 Javascript
类似于QQ的右滑删除效果的实现方法
2016/10/16 Javascript
javascript轮播图算法
2016/10/21 Javascript
vue.js指令v-for使用及索引获取
2016/11/03 Javascript
JavaScript框架Angular和React深度对比
2017/11/20 Javascript
JS/HTML5游戏常用算法之碰撞检测 包围盒检测算法详解【矩形情况】
2018/12/13 Javascript
vue无限轮播插件代码实例
2019/05/10 Javascript
解决pycharm双击但是无法打开的情况
2020/10/31 Javascript
Python创建xml的方法
2015/03/10 Python
Python实现自动上京东抢手机
2018/02/06 Python
python Tkinter版学生管理系统
2019/02/20 Python
Python Merge函数原理及用法解析
2020/09/16 Python
世界著名的顶级牛排:Omaha Steak(奥马哈牛排)
2016/09/20 全球购物
金牌葡萄酒俱乐部:Gold Medal Wine Club
2017/11/02 全球购物
P D PAOLA法国官网:西班牙著名的珠宝首饰品牌
2020/02/15 全球购物
Envie de Fraise意大利:法国网上推出的孕妇装品牌
2020/10/18 全球购物
颇特女士:NET-A-PORTER(直邮中国)
2020/07/11 全球购物
法学专业个人求职信
2013/09/26 职场文书
会计职业生涯规划书
2014/01/13 职场文书
班级入场式解说词
2014/02/01 职场文书
《列夫托尔斯泰》教学反思
2014/02/10 职场文书
生育关怀行动实施方案
2014/03/26 职场文书
教育系统干部作风整顿心得体会
2014/09/09 职场文书
《孙子兵法》:欲成大事者,需读懂这些致胜策略
2019/08/23 职场文书