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 include加载文件两种方式效率比较
Aug 08 PHP
php随机输出名人名言的代码
Oct 07 PHP
浅析php学习的路线图
Jul 10 PHP
PHP5中实现多态的两种方法实例分享
Apr 21 PHP
PHP函数addslashes和mysql_real_escape_string的区别
Apr 22 PHP
PHP函数http_build_query使用详解
Aug 20 PHP
使用YUI+Ant 实现JS CSS压缩
Sep 02 PHP
PHP输出日历表代码实例
Mar 27 PHP
PHP简单实现断点续传下载的方法
Sep 25 PHP
php文件上传你必须知道的几点
Oct 20 PHP
使用PHP访问RabbitMQ消息队列的方法示例
Jun 06 PHP
CI框架教程之优化验证码机制详解【验证码辅助函数】
Apr 16 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
一个高ai的分页函数和一个url函数
2006/10/09 PHP
php 分库分表hash算法
2009/11/12 PHP
php实现购物车功能(上)
2020/07/23 PHP
php微信浏览器分享设置以及回调详解
2016/08/01 PHP
php车辆违章查询数据示例
2016/10/14 PHP
基于php判断客户端类型
2016/10/14 PHP
PHP命令空间namespace及use的用法小结
2017/11/27 PHP
PHP的new static和new self的区别与使用
2019/11/27 PHP
window.parent与window.openner区别介绍
2012/04/12 Javascript
jquery easyui滚动条部分设置介绍
2013/09/12 Javascript
javascript控制Div层透明属性由浅变深由深变浅逐渐显示
2013/11/12 Javascript
js 弹出新页面避免被浏览器、ad拦截的一种新方法
2014/04/30 Javascript
jquery向上向下取整适合分页查询
2014/09/06 Javascript
在Node.js中使用HTTP上传文件的方法
2015/06/23 Javascript
jquery实现向下滑出的二级导航下滑菜单效果
2015/08/25 Javascript
jQuery实现的鼠标滑过弹出放大图片特效
2016/01/08 Javascript
jQuery获取随机颜色的实例代码
2018/05/21 jQuery
layui select获取自定义属性方法
2018/08/15 Javascript
详解在Node.js中发起HTTP请求的5种方法
2019/01/10 Javascript
微信小程序textarea层级过高(盖住其他元素)问题的解决办法
2019/03/04 Javascript
js验证账户名是否重复
2020/05/26 Javascript
python3.5 + PyQt5 +Eric6 实现的一个计算器代码
2017/03/11 Python
机器学习10大经典算法详解
2017/12/07 Python
PyQt5每天必学之组合框
2018/04/20 Python
解决python os.mkdir创建目录失败的问题
2018/10/16 Python
Python简单实现区域生长方式
2020/01/16 Python
python+gdal+遥感图像拼接(mosaic)的实例
2020/03/10 Python
keras 权重保存和权重载入方式
2020/05/21 Python
css3让div随鼠标移动而抖动起来
2014/02/10 HTML / CSS
详解HTML5中的Communication API基本使用方法
2016/01/29 HTML / CSS
美国家用电器和电子产品商店:Abt
2016/09/06 全球购物
有abstract方法的类一定要用abstract修饰吗
2016/03/14 面试题
业务助理岗位职责
2013/11/18 职场文书
体育运动口号
2014/06/09 职场文书
python第三方网页解析器 lxml 扩展库与 xpath 的使用方法
2021/04/06 Python
使用这 6个Vue加载动画库来减少我们网站的跳出率
2021/05/18 Vue.js