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日历程序
Dec 06 PHP
php桌面中心(一) 创建数据库
Mar 11 PHP
php mysql数据库操作分页类
Jun 04 PHP
php下尝试使用GraphicsMagick的缩略图功能
Jan 01 PHP
Laravel SQL语句记录方式(推荐)
May 26 PHP
PHP实现数据分页显示的简单实例
May 26 PHP
yii2中结合gridview如何使用modal弹窗实例代码详解
Jun 12 PHP
深入理解PHP JSON数组与对象
Jul 19 PHP
PHP HTTP 认证实例详解
Nov 03 PHP
PHP基于自定义类随机生成姓名的方法示例
Aug 05 PHP
php生成毫秒时间戳的实例讲解
Sep 22 PHP
swoole锁的机制代码实例讲解
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获取post中的json数据的实现方法
2011/06/08 PHP
仿Aspnetpager的一个PHP分页类代码 附源码下载
2012/10/08 PHP
php截取中文字符串不乱码的方法
2013/12/25 PHP
PHP中使用addslashes函数转义的安全性原理分析
2014/11/03 PHP
php导出中文内容excel文件类实例
2015/07/06 PHP
深入理解PHP JSON数组与对象
2016/07/19 PHP
PHP中quotemeta()函数的用法讲解
2019/04/04 PHP
善用事件代理,警惕闭包的性能陷阱。
2011/01/20 Javascript
javascript数组的使用
2013/03/28 Javascript
javascript中字符串的定义示例代码
2013/12/19 Javascript
JavaScript中的Math.atan2()方法使用详解
2015/06/15 Javascript
javascript实现的简单的表单验证
2015/07/10 Javascript
Bootstrap每天必学之工具提示(Tooltip)插件
2016/04/26 Javascript
AngularJS 实现JavaScript 动画效果详解
2016/09/08 Javascript
js实现短信发送倒计时功能(正则验证)
2017/02/10 Javascript
从零开始学习Node.js系列教程四:多页面实现数学运算的client端和server端示例
2017/04/13 Javascript
JS 中使用Promise 实现红绿灯实例代码(demo)
2017/10/20 Javascript
如何编写一个完整的Angular4 FormText 组件
2017/11/18 Javascript
VUE + UEditor 单图片跨域上传功能的实现方法
2018/02/08 Javascript
一文读懂ES7中的javascript修饰器
2019/05/06 Javascript
JS array数组检测方式解析
2020/05/19 Javascript
[13:25]VP vs VICI (BO3)
2018/06/07 DOTA
Python中使用urllib2防止302跳转的代码例子
2014/07/07 Python
Python中__call__用法实例
2014/08/29 Python
scrapy-redis分布式爬虫的搭建过程(理论篇)
2020/09/29 Python
美国女孩洋娃娃店:American Girl
2017/10/24 全球购物
Clarks鞋澳大利亚官方网站:Clarks Australia
2019/12/25 全球购物
捷克建筑材料网上商店:DEK.cz
2021/03/06 全球购物
四年大学生活的个人自我评价
2013/12/11 职场文书
机关出纳岗位职责
2014/04/03 职场文书
全国文明单位申报材料
2014/05/31 职场文书
一般基层干部群众路线教育实践活动个人对照检查材料
2014/11/04 职场文书
2014年药剂科工作总结
2014/11/26 职场文书
先进党支部申报材料
2014/12/24 职场文书
云冈石窟导游词
2015/02/04 职场文书
在JavaScript中如何使用宏详解
2021/05/06 Javascript