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 相关文章推荐
PHP编程与应用
Oct 09 PHP
简单的php数据库操作类代码(增,删,改,查)
Apr 08 PHP
php 获取本地IP代码
Jun 23 PHP
destoon安全设置中需要设置可写权限的目录及文件
Jun 21 PHP
php计算两个文件相对路径的方法
Mar 14 PHP
WordPress中注册菜单与调用菜单的方法详解
Dec 18 PHP
详解PHP中的null合并运算符
Dec 30 PHP
PHP闭包函数传参及使用外部变量的方法
Mar 15 PHP
PHP设计模式之观察者模式定义与用法示例
Aug 04 PHP
设定php简写功能的方法
Nov 28 PHP
深入解析PHP底层机制及相关原理
Dec 11 PHP
PHP安装扩展mcrypt以及相关依赖项深入讲解
Mar 04 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的几个常用数字判断函数代码
2012/04/24 PHP
PHP中使用GD库创建圆形饼图的例子
2014/11/19 PHP
jQuery-Easyui 1.2 实现多层菜单效果的代码
2012/01/13 Javascript
js函数参数设置默认值的一种变通实现方法
2014/05/26 Javascript
JavaScript的Date()方法使用详解
2015/06/09 Javascript
js判断手机访问或者PC的几个例子(常用于手机跳转)
2015/12/15 Javascript
Jquery表单验证失败后不提交的解决方法
2016/10/18 Javascript
angularJs 表格添加删除修改查询方法
2018/02/27 Javascript
在vue-cli搭建的项目中增加后台mock接口的方法
2018/04/26 Javascript
通过cordova将vue项目打包为webapp的方法
2019/02/02 Javascript
JQuery的加载和选择器用法简单示例
2019/05/13 jQuery
如何在Angular8.0下使用ngx-translate进行国际化配置
2019/07/24 Javascript
浅析JS中NEW的实现原理及重写
2020/02/20 Javascript
javascript设计模式 ? 命令模式原理与用法实例分析
2020/04/20 Javascript
解决React在安装antd之后出现的Can't resolve './locale'问题(推荐)
2020/05/03 Javascript
[03:04]2018年度DOTA2玩家最喜爱的主播-完美盛典
2018/12/16 DOTA
python网络编程学习笔记(一)
2014/06/09 Python
Python 抓取动态网页内容方案详解
2014/12/25 Python
编写Python脚本把sqlAlchemy对象转换成dict的教程
2015/05/29 Python
在Lighttpd服务器中运行Django应用的方法
2015/07/22 Python
解析Python中的eval()、exec()及其相关函数
2017/12/20 Python
TensorFlow神经网络优化策略学习
2018/03/09 Python
Python闭包函数定义与用法分析
2018/07/20 Python
Python爬虫设置代理IP(图文)
2018/12/23 Python
opencv 图像礼帽和图像黑帽的实现
2020/07/07 Python
Python爬虫开发与项目实战
2020/12/16 Python
美国美发品牌:Bumble and Bumble
2016/10/08 全球购物
联想中国官方商城:Lenovo China
2017/10/18 全球购物
MYSQL基础面试题
2012/05/13 面试题
2014两会优秀的心得体会范文
2014/03/17 职场文书
职业规划实施方案
2014/06/10 职场文书
领导班子四风对照检查材料
2014/09/23 职场文书
民间借贷协议书范本
2014/10/01 职场文书
离婚案件被告代理词
2015/05/23 职场文书
Python djanjo之csrf防跨站攻击实验过程
2021/05/14 Python
Nginx使用Lua模块实现WAF的原理解析
2021/09/04 Servers