PHP基于SPL实现的迭代器模式示例

 更新时间:2018年04月22日 14:38:33   作者:LSGOZJ  
这篇文章主要介绍了PHP基于SPL实现的迭代器模式,简单描述了迭代器模式的概念、原理并结合实例形式分析了php使用SPL实现迭代器模式的相关操作技巧与注意事项,需要的朋友可以参考下

本文实例讲述了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数组(Array)操作技巧大全》、《PHP基本语法入门教程》、《PHP运算与运算符用法总结》、《php字符串(string)用法总结》、《php+mysql数据库操作入门教程》及《php常见数据库操作技巧汇总

希望本文所述对大家PHP程序设计有所帮助。

相关文章

  • PHP安全防范技巧分享

    PHP安全防范技巧分享

    这里简单介绍一些基本编程要点, 相对系统安全来说,php安全防范更多要求编程人员对用户输入的各种参数能更细心.
    2011-11-11
  • 解决Laravel blade模板转义html标签的问题

    解决Laravel blade模板转义html标签的问题

    今天小编就为大家分享一篇解决Laravel blade模板转义html标签的问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2019-09-09
  • Laravel与CI框架中截取字符串函数

    Laravel与CI框架中截取字符串函数

    这篇文章主要介绍了Laravel与CI框架中截取字符串函数的相关代码,需要的朋友可以参考下
    2016-05-05
  • php制作中间带自己定义图片二维码的方法

    php制作中间带自己定义图片二维码的方法

    本文为大家介绍下如何使用php制作中间带自己定义图片的二维码,需要的朋友可以参考下
    2014-01-01
  • PHP正则替换函数preg_replace()报错:Notice Use of undefined constant的解决方法分析

    PHP正则替换函数preg_replace()报错:Notice Use of undefined constant的解

    这篇文章主要介绍了PHP正则替换函数preg_replace()报错:Notice Use of undefined constant的解决方法,结合具体实例形式分析了preg_replace()报错的原因与相关解决技巧,需要的朋友可以参考下
    2017-02-02
  • php实现encode64编码类实例

    php实现encode64编码类实例

    这篇文章主要介绍了php实现encode64编码类,实例分析了php实现encode64编码的技巧,具有一定参考借鉴价值,需要的朋友可以参考下
    2015-03-03
  • PHP中SESSION的注销与清除

    PHP中SESSION的注销与清除

    本文给大家分享的是PHP中SESSION的注销与清除的方法和示例,非常的实用,有需要的小伙伴可以参考下。
    2015-04-04
  • php中switch语句用法详解

    php中switch语句用法详解

    Switch语句也是面向对象编程语句中最长常见的逻辑控制语句了。Switch 语句用于执行基于多个不同条件的不同动作 – 即当条件不同的时候,执行不同的逻辑操作。
    2015-08-08
  • 你真的了解PHP中的引用符号(&)吗

    你真的了解PHP中的引用符号(&)吗

    php的引用就是在变量或者函数、对象等前面加上&符号,但PHP中的&符号你真的了解吗?真的会用吗?下面随着小编来一起学习学习吧
    2021-05-05
  • php跨域检测类允许部分域名访问的示例详解

    php跨域检测类允许部分域名访问的示例详解

    PHP跨域检测类是一种封装了跨域检测逻辑的PHP类,它可以用于在PHP应用程序中检测和处理跨域请求,以确保安全和正常的跨域通信,本文给出了示例给大家介绍php如何允许部分域名访问,需要的朋友可以参考下
    2023-12-12

最新评论