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新手上路(十二)
Oct 09 PHP
PHP Undefined index报错的修复方法
Jul 17 PHP
php中删除字符串中最先出现某个字符的实现代码
Feb 03 PHP
PHP面向对象程序设计之类常量用法实例
Aug 20 PHP
PHP中new static()与new self()的区别异同分析
Aug 22 PHP
fckeditor上传文件按日期存放及重命名方法
May 22 PHP
yii2.0实现验证用户名与邮箱功能
Dec 22 PHP
详解EventDispatcher事件分发组件
Dec 25 PHP
PHP错误处理函数register_shutdown_function使用示例
Jul 03 PHP
PHP实现将base64编码字符串转换成图片示例
Jun 22 PHP
PHP convert_cyr_string()函数讲解
Feb 13 PHP
TP5框架使用QueryList采集框架爬小说操作示例
Mar 26 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 array_multisort() 函数的深入解析
2013/06/20 PHP
php中jpgraph类库的使用介绍
2013/08/08 PHP
PHP修改session_id示例代码
2014/01/08 PHP
PHP过滤器 filter_has_var() 函数用法实例分析
2020/04/23 PHP
javascript Base类 包含基本的方法
2009/07/22 Javascript
XENON基于JSON变种
2010/07/27 Javascript
jQuery中empty()方法用法实例
2015/01/16 Javascript
js分页工具实例
2015/01/28 Javascript
浅谈轻量级js模板引擎simplite
2015/02/13 Javascript
JavaScript实现带标题的图片轮播特效
2015/05/20 Javascript
TypeOf这些知识点你了解吗
2016/02/21 Javascript
Bootstrap CSS组件之导航(nav)
2016/12/17 Javascript
JS实现简单的天数计算器完整实例
2017/04/28 Javascript
vue实例中data使用return包裹的方法
2018/08/27 Javascript
vue弹窗插件实战代码
2018/09/08 Javascript
vuex2中使用mapGetters/mapActions报错的解决方法
2018/10/20 Javascript
vue实现弹幕功能
2019/10/25 Javascript
vue3中轻松实现switch功能组件的全过程
2021/01/07 Vue.js
[04:14]从西雅图到上海——玩家自制DOTA2主题歌曲应援TI9
2019/07/11 DOTA
利用python3随机生成中文字符的实现方法
2017/11/24 Python
Python Subprocess模块原理及实例
2019/08/26 Python
Python实现计算长方形面积(带参数函数demo)
2020/01/18 Python
详解pandas中iloc, loc和ix的区别和联系
2020/03/09 Python
TensorFlow tf.nn.conv2d_transpose是怎样实现反卷积的
2020/04/20 Python
python xlsxwriter模块的使用
2020/12/24 Python
美国电子产品折扣网站:Daily Steals
2017/05/20 全球购物
欧洲最大的滑雪假期供应商之一:Sunweb Holidays
2018/01/06 全球购物
The Hut英国:英国领先的豪华在线百货商店
2019/07/26 全球购物
法国在线药房:DoctiPharma
2020/10/21 全球购物
求两个数的乘积和商数,该作用由宏定义来实现
2013/03/13 面试题
杭州联环马网络笔试题面试题
2013/08/04 面试题
毕业生文员求职信
2013/11/03 职场文书
学生安全责任书
2014/04/15 职场文书
兼职安全员岗位职责
2015/02/15 职场文书
导游词之阳朔遇龙河
2019/12/16 职场文书
Redis性能监控的实现
2021/07/09 Redis