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仿博客园 个人博客(2) 数据库增添改删
Jul 05 PHP
php中的PHP_EOL换行符详细解析
Oct 26 PHP
thinkphp普通查询与表达式查询实例分析
Nov 24 PHP
PHP、Python和Javascript的装饰器模式对比
Feb 03 PHP
php json中文编码为null的解决办法
Dec 14 PHP
php自定义截取中文字符串-utf8版
Feb 27 PHP
PHP计算近1年的所有月份
Mar 13 PHP
PHP使用glob方法遍历文件夹下所有文件的实例
Oct 17 PHP
浅谈php调用python文件
Mar 29 PHP
php 使用 __call实现重载功能示例
Nov 18 PHP
php使用redis的有序集合zset实现延迟队列应用示例
Feb 20 PHP
php开发最强大的IDE编辑的phpstorm 2020.2配置Xdebug调试的详细教程
Aug 17 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读注册表
2006/10/09 PHP
ThinkPHP3.0略缩图不能保存到子目录的解决方法
2012/09/30 PHP
php获取表单中多个同名input元素的值
2014/03/20 PHP
ThinkPHP 404页面的设置方法
2015/01/14 PHP
php实现猴子选大王问题算法实例
2015/04/20 PHP
JS实现悬浮移动窗口(悬浮广告)的特效
2013/03/12 Javascript
jQuery判断checkbox是否选中的小例子
2013/12/02 Javascript
js函数定时器实现定时读取系统实时连接数
2014/04/30 Javascript
js中函数调用的两种常用方法使用介绍
2014/07/17 Javascript
JavaScript组件焦点与页内锚点间传值的方法
2015/02/02 Javascript
使用Javascript写的2048小游戏
2015/11/25 Javascript
VUEJS 2.0 子组件访问/调用父组件的实例
2018/02/10 Javascript
jquery.param()实现数组或对象的序列化方法
2018/10/08 jQuery
微信小程序利用云函数获取手机号码
2019/12/17 Javascript
React Hooks 实现和由来以及解决的问题详解
2020/01/17 Javascript
mapboxgl实现带箭头轨迹线的代码
2021/01/04 Javascript
跟老齐学Python之print详解
2014/09/28 Python
bpython 功能强大的Python shell
2016/02/16 Python
详解Python 数据库 (sqlite3)应用
2016/12/07 Python
Python实现选择排序
2017/06/04 Python
Python基础教程之异常详解
2019/01/10 Python
django实现用户注册实例讲解
2019/10/30 Python
python虚拟环境模块venv使用及示例
2020/03/04 Python
Python的scikit-image模块实例讲解
2020/12/30 Python
Scrapy+Selenium自动获取cookie爬取网易云音乐个人喜爱歌单
2021/02/01 Python
CSS3 Calc实现滚动条出现页面不跳动问题
2017/09/14 HTML / CSS
ReVive利维肤美国官网:RéVive Skincare
2018/04/18 全球购物
绿色美容,有机护肤品和化妆品:Safe & Chic
2018/10/29 全球购物
瑞典在互联网上最大的宠物商店:Animail
2020/10/31 全球购物
params有什么用
2016/03/01 面试题
体育教学随笔感言
2014/02/24 职场文书
优秀广告词大全
2014/03/19 职场文书
高中毕业典礼演讲稿
2014/09/09 职场文书
2014年中班下学期工作总结
2014/12/11 职场文书
婚姻出轨保证书
2015/05/08 职场文书
如何用python清洗文件中的数据
2021/06/18 Python