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 5昨天隆重推出--PHP 5/Zend Engine 2.0新特性
Oct 09 PHP
5.PHP的其他功能
Oct 09 PHP
php实现的在线人员函数库
Apr 09 PHP
PHP rawurlencode与urlencode函数的深入分析
Jun 08 PHP
php中用date函数获取当前时间有误的解决办法
Aug 02 PHP
php操作xml
Oct 27 PHP
php断点续传之如何分割合并文件
Mar 22 PHP
Sublime里直接运行PHP配置方法
Nov 28 PHP
php判断两个浮点数是否相等的方法
Mar 14 PHP
PHP-FPM的配置与优化讲解
Mar 15 PHP
php探针使用原理和技巧讲解
Sep 17 PHP
PHP简单实现图片格式转换(jpg转png,gif转png等)
Oct 30 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
咖啡豆的最常见发酵处理方法,详细了解一下
2021/03/03 冲泡冲煮
Zend Guard一些常见问题解答
2008/09/11 PHP
Mac环境下php操作mysql数据库的方法分享
2015/05/11 PHP
jquery的键盘事件修改代码
2011/02/24 Javascript
JS.findElementById()使用介绍
2013/09/21 Javascript
java与javascript之间json格式数据互转介绍
2013/10/29 Javascript
js获取触发事件元素在整个网页中的绝对坐标(示例代码)
2013/12/13 Javascript
javascript获取checkbox复选框获取选中的选项
2014/08/12 Javascript
浅谈javascript中this在事件中的应用
2015/02/15 Javascript
借助FileReader实现将文件编码为Base64后通过AJAX上传
2015/12/24 Javascript
javascript实现简单的全选和反选功能
2016/01/05 Javascript
原生javascript 学习之js变量全面了解
2016/07/14 Javascript
javascript实现获取图片大小及图片等比缩放的方法
2016/11/24 Javascript
使用prop解决一个checkbox选中后再次选中失效的问题
2017/07/05 Javascript
js is_valid_filename验证文件名的函数
2017/07/19 Javascript
基于vue cli 通过命令行传参实现多环境配置
2018/07/12 Javascript
Js 利用正则表达式和replace函数获取string中所有被匹配到的文本(推荐)
2018/10/28 Javascript
解决微信小程序中转换时间格式IOS不兼容的问题
2019/02/15 Javascript
在LayUI图片上传中,解决由跨域问题引起的请求接口错误的方法
2019/09/24 Javascript
压缩Vue.js打包后的体积方法总结(Vue.js打包后体积过大问题)
2020/02/03 Javascript
[36:33]完美世界DOTA2联赛PWL S2 LBZS vs Forest 第二场 11.29
2020/12/02 DOTA
numpy中索引和切片详解
2017/12/15 Python
python日期相关操作实例小结
2019/06/24 Python
TensorFlow基本的常量、变量和运算操作详解
2020/02/03 Python
印尼最大的在线购物网站:MatahariMall.com
2016/08/26 全球购物
美国牛仔品牌:True Religion
2018/11/16 全球购物
New Balance加拿大官方网站:运动鞋和健身服装
2018/11/19 全球购物
Farfetch澳大利亚官网:Farfetch Australia
2020/04/26 全球购物
如何处理简单的PHP错误
2015/10/14 面试题
骨干教师考核方案
2014/05/09 职场文书
幼儿园安全责任书范本
2014/07/24 职场文书
美德少年事迹材料1000字
2014/08/21 职场文书
2014年医院工作总结
2014/11/20 职场文书
青年岗位能手事迹材料
2014/12/23 职场文书
抗洪救灾感谢信
2015/01/22 职场文书
老乡会致辞
2015/07/28 职场文书