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下实现农历日历的代码
Mar 07 PHP
PHP 动态随机生成验证码类代码
Apr 09 PHP
PHP 5.3.1 安装包 VC9 VC6不同版本的区别是什么
Jul 04 PHP
PHP面向对象分析设计的61条军规小结
Jul 17 PHP
PHP+SQL 注入攻击的技术实现以及预防办法
Jan 27 PHP
php中0,null,empty,空,false,字符串关系的详细介绍
Jun 20 PHP
md5 16位二进制与32位字符串相互转换示例
Dec 30 PHP
兼容ie6浏览器的php下载文件代码分享
Jul 14 PHP
php内嵌函数用法实例
Mar 20 PHP
php安装php_rar扩展实现rar文件读取和解压的方法
Nov 17 PHP
PHP+jQuery实现即点即改功能示例
Feb 21 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中new static()与new self()的区别异同分析
2014/08/22 PHP
PHP里的单例类写法实例
2015/06/25 PHP
Thinkphp3.2简单解决多文件上传只上传一张的问题
2017/09/26 PHP
Laravel如何使用Redis共享Session
2018/02/23 PHP
PHP简单实现正则匹配省市区的方法
2018/04/13 PHP
JavaScript 构造函数 面相对象学习必备知识
2010/06/09 Javascript
js点击button按钮跳转到另一个新页面
2014/10/10 Javascript
jQuery实现邮箱下拉列表自动补全功能
2016/09/08 Javascript
AngularJS实现ajax请求的方法
2016/11/22 Javascript
JS实现图片高斯模糊切换效果的焦点图实例
2017/01/21 Javascript
Vue学习笔记进阶篇之多元素及多组件过渡
2017/07/19 Javascript
jQuery取得元素标签名称小结(附代码)
2017/08/16 jQuery
微信小程序自定义prompt组件步骤详解
2018/06/12 Javascript
微信小程序自定义组件之可清除的input组件
2018/07/17 Javascript
手写Vue弹窗Modal的实现代码
2019/09/11 Javascript
为什么Vue3.0使用Proxy实现数据监听(defineProperty表示不背这个锅)
2019/10/14 Javascript
python中os操作文件及文件路径实例汇总
2015/01/15 Python
Python面向对象编程中的类和对象学习教程
2015/03/30 Python
在Python中操作列表之list.extend()方法的使用
2015/05/20 Python
解决python文件字符串转列表时遇到空行的问题
2017/07/09 Python
python简易远程控制单线程版
2018/06/20 Python
Python测试网络连通性示例【基于ping】
2018/08/03 Python
python爬取网易云音乐评论
2018/11/16 Python
计算机二级python学习教程(3) python语言基本数据类型
2019/05/16 Python
.img/.hdr格式转.nii格式的操作
2020/07/01 Python
python 监控服务器是否有人远程登录(详细思路+代码)
2020/12/18 Python
CSS伪类与CSS伪元素的区别及由来具体说明
2012/12/07 HTML / CSS
HTML5 canvas 基本语法
2009/08/26 HTML / CSS
俄语专业毕业生推荐信
2013/10/28 职场文书
人事主管岗位职责
2014/01/30 职场文书
历史专业学生的自我评价
2014/02/28 职场文书
《罗布泊,消逝的仙湖》教学反思
2014/03/01 职场文书
施工员岗位职责
2014/03/16 职场文书
高一军训的心得体会
2014/09/01 职场文书
亮剑观后感300字
2015/06/05 职场文书
Windows server 2012 配置Telnet以及用法详解
2022/04/28 Servers