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 相关文章推荐
使用Limit参数优化MySQL查询的方法
Nov 12 PHP
PHP 判断变量类型实现代码
Oct 23 PHP
Windows下XDebug 手工配置与使用说明
Jul 11 PHP
在smarty模板中使用PHP函数的方法
Apr 23 PHP
php 安全过滤函数代码
May 07 PHP
php类中private属性继承问题分析
Nov 01 PHP
深入解析fsockopen与pfsockopen的区别
Jul 05 PHP
分享下页面关键字抓取www.icbase.com站点代码(带asp.net参数的)
Jan 30 PHP
php生成html文件方法总结
Dec 01 PHP
PHP中常见的缓存技术实例分析
Sep 23 PHP
thinkphp 字母函数详解T/I/N/D/M/A/R/U
Apr 03 PHP
在云虚拟主机部署thinkphp5项目的步骤详解
Dec 21 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
如何跨站抓取别的站点的页面的补充
2006/10/09 PHP
PHP 编程的 5个良好习惯
2009/02/20 PHP
php数据结构与算法(PHP描述) 快速排序 quick sort
2012/06/21 PHP
通过php删除xml文档内容的方法
2015/01/23 PHP
php封装的表单验证类完整实例
2016/10/19 PHP
解决php extension 加载顺序问题
2019/08/16 PHP
如何在PHP中使用AES加密算法加密数据
2020/06/24 PHP
经验几则 推荐
2006/09/05 Javascript
关于图片验证码设计的思考
2007/01/29 Javascript
[原创]js与自动伸缩图片 自动缩小图片的多浏览器兼容的方法总结
2007/03/12 Javascript
js css样式操作代码(批量操作)
2009/10/09 Javascript
javascript将数字转换整数金额大写的方法
2015/01/27 Javascript
javascript模拟评分控件实现方法
2015/05/13 Javascript
jQuery购物车插件jsorder用法(支持后台处理程序直接转换成DataTable处理)
2016/06/08 Javascript
利用JS实现点击按钮后图片自动切换的简单方法
2016/10/24 Javascript
详解Angular2 之 结构型指令
2017/06/21 Javascript
JS图片延迟加载插件LazyImgv1.0用法分析【附demo源码下载】
2017/09/04 Javascript
webpack公共组件引用路径简化小技巧
2018/06/15 Javascript
微信小程序学习笔记之登录API与获取用户信息操作图文详解
2019/03/29 Javascript
深入了解JavaScript 私有化
2019/05/30 Javascript
VUE前后端学习tab写法实例
2019/08/06 Javascript
Python 变量类型及命名规则介绍
2013/06/08 Python
Python实现的线性回归算法示例【附csv文件下载】
2018/12/29 Python
Python性能分析工具Profile使用实例
2019/11/19 Python
Python文件操作函数用法实例详解
2019/12/24 Python
django xadmin中form_layout添加字段显示方式
2020/03/30 Python
Python ckeditor富文本编辑器代码实例解析
2020/06/22 Python
Django自带的用户验证系统实现
2020/12/18 Python
python函数超时自动退出的实操方法
2020/12/28 Python
pycharm配置python 设置pip安装源为豆瓣源
2021/02/05 Python
俄罗斯电子产品、计算机和家用电器购物网站:OLDI
2019/10/27 全球购物
机械绘图员岗位职责
2013/11/19 职场文书
放弃继承权公证书
2015/01/23 职场文书
试用期旷工辞退通知书
2015/04/17 职场文书
解决Jupyter-notebook不弹出默认浏览器的问题
2021/03/30 Python
JS前端可扩展的低代码UI框架Sunmao使用详解
2022/07/23 Javascript