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基础学习小结
Apr 17 PHP
解析CodeIgniter自定义配置文件
Jun 18 PHP
ThinkPHP实现将本地文件打包成zip下载
Jun 26 PHP
Yii框架中 find findAll 查找出制定的字段的方法对比
Sep 10 PHP
php实现指定字符串中查找子字符串的方法
Mar 17 PHP
给WordPress的编辑后台添加提示框的代码实例分享
Dec 25 PHP
php实现三级级联下拉框
Apr 17 PHP
php基于curl重写file_get_contents函数实例
Nov 08 PHP
PHP实现简单的模板引擎功能示例
Sep 02 PHP
PHP网页安全认证的实例详解
Sep 28 PHP
PHP实现八皇后算法
May 06 PHP
Smarty模板配置实例简析
Jul 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传输数据的代码
2007/11/13 PHP
PHP 多进程 解决难题
2009/06/22 PHP
php实现网站插件机制的方法
2009/11/10 PHP
MySQL的FIND_IN_SET函数使用方法分享
2012/03/27 PHP
php强制运行广告的方法
2014/12/01 PHP
PHP实现清除MySQL死连接的方法
2016/07/23 PHP
Yii2 中实现单点登录的方法
2018/03/09 PHP
javascript 打印页面代码
2009/03/24 Javascript
JavaScript iframe的相互操作浅析
2009/10/14 Javascript
firefox插件Firebug的使用教程
2010/01/02 Javascript
细说javascript函数从函数的构成开始
2013/08/29 Javascript
jquery左右滚动焦点图banner图片鼠标经过显示上下页按钮
2013/10/11 Javascript
jquery实现手风琴效果实例代码
2013/11/15 Javascript
file控件选择上传文件确定后触发的js事件是哪个
2014/03/17 Javascript
基于jquery实现省市联动特效
2015/12/17 Javascript
thinkphp实现无限分类(使用递归)
2015/12/19 Javascript
移动端横屏的JS代码(beta)
2016/05/16 Javascript
Html中 IFrame的用法及注意点
2016/12/22 Javascript
详解如何将angular-ui的图片轮播组件封装成一个指令
2017/05/09 Javascript
nodejs实现的连接MySQL数据库功能示例
2018/01/25 NodeJs
JavaScript 下载svg图片为png格式
2018/06/21 Javascript
M2实现Nodejs项目自动部署的方法步骤
2019/05/05 NodeJs
基于jQuery实现挂号平台首页源码
2020/01/06 jQuery
Python中的super用法详解
2015/05/28 Python
Python算法之图的遍历
2017/11/16 Python
python3使用QQ邮箱发送邮件
2020/05/20 Python
Django 缓存配置Redis使用详解
2019/07/23 Python
CSS3 filter(滤镜)实现网页灰色或者黑色模式的代码
2020/11/30 HTML / CSS
食品安全工作实施方案
2014/03/26 职场文书
会展策划与管理专业求职信
2014/06/09 职场文书
公益广告标语
2014/06/19 职场文书
学生逃课检讨书1000字
2014/10/20 职场文书
乡镇保密工作承诺书
2015/05/04 职场文书
Python进阶学习之带你探寻Python类的鼻祖-元类
2021/05/08 Python
使用 Apache Superset 可视化 ClickHouse 数据的两种方法
2021/07/07 Servers
单机多实例部署 MySQL8.0.20
2022/05/15 MySQL