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防止sql注入代码实例
Dec 18 PHP
php使用百度ping服务代码实例
Jun 19 PHP
自定义session存储机制避免会话保持问题
Oct 08 PHP
php类的定义与继承用法实例
Jul 07 PHP
php对二维数组进行相关操作(排序、转换、去空白等)
Nov 04 PHP
yii2中dropDownList实现二级和三级联动写法
Apr 26 PHP
php表单文件iframe异步上传实例讲解
Jul 26 PHP
三个思路解决laravel上传文件报错:413 Request Entity Too Large问题
Nov 13 PHP
PHP实现对数字分隔加千分号的方法
Mar 18 PHP
php简单计算权重的方法示例【适合抽奖类应用】
Jun 10 PHP
TP3.2.3框架文件上传操作实例详解
Jan 23 PHP
TP5多入口设置实例讲解
Dec 15 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数组索引的Key加引号和不加引号的区别
2014/08/19 PHP
PHP+fiddler抓包采集微信文章阅读数点赞数的思路详解
2019/12/20 PHP
RGB颜色值转HTML十六进制(HEX)代码的JS函数
2009/04/25 Javascript
用js模拟JQuery的show与hide动画函数代码
2010/09/20 Javascript
Dom在ajax技术中的作用说明
2010/10/25 Javascript
JavaScript高级程序设计 阅读笔记(二十) js错误处理
2012/08/14 Javascript
Jquery实现图片放大镜效果的思路及代码(自写)
2013/10/18 Javascript
jquery遍历json对象集合详解
2016/05/18 Javascript
BootStrap 轮播插件(carousel)支持左右手势滑动的方法(三种)
2016/07/07 Javascript
js关于getImageData跨域问题的解决方法
2016/10/14 Javascript
angularJs关于指令的一些冷门属性详解
2016/10/24 Javascript
JS触摸屏网页版仿app弹窗型滚动列表选择器/日期选择器
2016/10/30 Javascript
bootstrap滚动监控器使用方法解析
2017/01/13 Javascript
javascript 组合按键事件监听实现代码
2017/02/21 Javascript
JavaScript使用ul中li标签实现删除效果
2019/04/15 Javascript
[47:20]DAC2018 4.4 淘汰赛 Optic vs Mineski 第一场
2018/04/05 DOTA
详解Python中with语句的用法
2015/04/15 Python
Python中使用partial改变方法默认参数实例
2015/04/28 Python
Python上传package到Pypi(代码简单)
2016/02/06 Python
Python编程实现输入某年某月某日计算出这一天是该年第几天的方法
2017/04/18 Python
在TensorFlow中屏蔽warning的方式
2020/02/04 Python
解决Keras中Embedding层masking与Concatenate层不可调和的问题
2020/06/18 Python
Jo Malone美国官网:祖玛珑香水
2017/03/27 全球购物
Hoover胡佛官网:美国吸尘器和洗地机品牌
2019/01/09 全球购物
Harrods英国:世界领先的奢侈品百货商店
2020/09/23 全球购物
什么叫做SQL注入,如何防止
2016/10/04 面试题
工地安全生产标语
2014/06/06 职场文书
购房委托书范本
2014/09/18 职场文书
工程项目经理岗位职责
2015/02/02 职场文书
小学运动会加油词
2015/07/18 职场文书
2019商业计划书格式、范文
2019/04/24 职场文书
导游词之澳门妈祖庙
2019/12/19 职场文书
Mysql服务添加 iptables防火墙策略的方案
2021/04/29 MySQL
html5中sharedWorker实现多页面通信的示例代码
2021/05/07 Javascript
MySQL 查询速度慢的原因
2021/05/25 MySQL
sql字段解析器的实现示例
2021/06/23 SQL Server