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代码简化
Feb 08 PHP
ionCube 一款类似zend的PHP加密/解密工具
Jul 25 PHP
360通用php防护代码(使用操作详解)
Jun 18 PHP
PHP中字符安全过滤函数使用小结
Feb 25 PHP
php计算指定目录下文件占用空间的方法
Mar 13 PHP
Smarty最简单实现列表奇偶变色的方法
Jul 01 PHP
PHP实现仿百度文库,豆丁在线文档效果(word,excel,ppt转flash)
Mar 10 PHP
基于PHP常用文件函数和目录函数整理
Aug 17 PHP
php实现微信支付之现金红包
May 30 PHP
php模式设计之观察者模式应用实例分析
Sep 25 PHP
php写app用的框架整理
Sep 29 PHP
Laravel 验证码认证学习记录小结
Dec 20 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使用curl和正则表达式抓取网页数据示例
2014/04/13 PHP
简单谈谈PHP vs Node.js
2015/07/17 PHP
WordPress中注册菜单与调用菜单的方法详解
2015/12/18 PHP
深入理解PHP之OpCode原理详解
2016/06/01 PHP
php设计模式之建造器模式分析【星际争霸游戏案例】
2020/01/23 PHP
js文件中调用js的实现方法小结
2009/10/23 Javascript
可以浮动某个物体的jquery控件用法实例
2015/07/24 Javascript
浅析在javascript中创建对象的各种模式
2016/05/06 Javascript
无阻塞加载js,防止因js加载不了影响页面显示的问题
2016/12/18 Javascript
详解nodejs通过代理(proxy)发送http请求(request)
2017/09/22 NodeJs
微信小程序点击保存图片到本机功能
2019/12/13 Javascript
JS实现时间校验的代码
2020/05/25 Javascript
vue+axios 拦截器实现统一token的案例
2020/09/11 Javascript
多线程爬虫批量下载pcgame图片url 保存为xml的实现代码
2013/01/17 Python
python实现异步回调机制代码分享
2014/01/10 Python
深入剖析Python的爬虫框架Scrapy的结构与运作流程
2016/01/20 Python
TensorFlow的权值更新方法
2018/06/14 Python
python2 与 pyhton3的输入语句写法小结
2018/09/10 Python
如何利用Boost.Python实现Python C/C++混合编程详解
2018/11/08 Python
pyqt5 使用label控件实时显示时间的实例
2019/06/14 Python
基于Django ORM、一对一、一对多、多对多的全面讲解
2019/07/26 Python
Python笔记之facade模式
2019/11/20 Python
Python应用实现处理excel数据过程解析
2020/06/19 Python
CSS3径向渐变之大鱼吃小鱼之孤单的大鱼
2016/04/26 HTML / CSS
类和结构的区别
2012/08/15 面试题
玩具公司的创业计划书
2013/12/31 职场文书
医务人员自我评价
2014/01/26 职场文书
执行总经理岗位职责
2014/02/03 职场文书
四风批评与自我批评发言稿
2014/10/14 职场文书
2014年人事工作总结范文
2014/11/19 职场文书
2014年共青团工作总结
2014/12/10 职场文书
员工离职证明范本
2015/06/12 职场文书
运动会开幕式致辞
2015/07/29 职场文书
小学英语课教学反思
2016/02/15 职场文书
嵌入式Redis服务器在Spring Boot测试中的使用教程
2021/07/21 Redis
国庆节到了,利用JS实现一个生成国庆风头像的小工具 详解实现过程
2021/10/05 Javascript