当前位置:首页 > PHP教程 > php高级应用 > 列表

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

发布:smiling 来源: PHP粉丝网  添加日期:2021-09-12 14:59:03 浏览: 评论:0 

这篇文章主要介绍了PHP基于SPL实现的迭代器模式,简单描述了迭代器模式的概念、原理并结合实例形式分析了php使用SPL实现迭代器模式的相关操作技巧与注意事项,需要的朋友可以参考下。

本文实例讲述了PHP基于SPL实现的迭代器模式,分享给大家供大家参考,具体如下:

现在有这么两个类,Department部门类、Employee员工类:

  1. //部门类 
  2. class Department{ 
  3.   private $_name; 
  4.   private $_employees; 
  5.   function __construct($name){ 
  6.     $this->_name = $name; 
  7.     $this->employees = array(); 
  8.   } 
  9.   function addEmployee(Employee $e){ 
  10.     $this->_employees[] = $e; 
  11.     echo "员工{$e->getName()}被分配到{$this->_name}中去"; 
  12.   } 
  13. } 
  14. //员工类 
  15. class Employee{ 
  16.   private $_name; 
  17.   function __construct($name){ 
  18.     $this->_name = $name; 
  19.   } 
  20.   function getName(){ 
  21.     return $this->_name; 
  22.   } 
  23. } 
  24. //应用: 
  25. $lsgo = new Department('LSGO实验室'); 
  26. $e1 = new Employee("小锦"); 
  27. $e2 = new Employee("小猪"); 
  28. $lsgo->addEmployee($e1); 
  29. $lsgo->addEmployee($e2); 

好了,现在LSGO实验室已经有两个部员了,现在我想把全部的部员都列出来,就是用循环来获取部门的每个员工的详情。

在这里我们用PHP中的SPL标准库提供的迭代器来实现。

《大话设计模式》中如是说:

迭代器模式:迭代器模式是遍历集合的成熟模式,迭代器模式的关键是将遍历集合的任务交给一个叫做迭代器的对象,它的工作时遍历并选择序列中的对象,而客户端程序员不必知道或关心该集合序列底层的结构。

迭代器模式的作用简而言之:是使所有复杂数据结构的组件都可以使用循环来访问

假如我们的对象要实现迭代,我们使这个类实现 Iterator(SPL标准库提供),这是一个迭代器接口,为了实现该接口,我们必须实现以下方法:

current(),该函数返回当前数据项

key(),该函数返回当前数据项的键或者该项在列表中的位置

next(),该函数使数据项的键或者位置前移

rewind(),该函数重置键值或者位置

valid(),该函数返回 bool 值,表明当前键或者位置是否指向数据值

实现了 Iterator 接口和规定的方法后,PHP就能够知道该类类型的对象需要迭代。

我们使用这种方式重构 Department 类:

  1. class Department implements Iterator 
  2. { 
  3.   private $_name; 
  4.   private $_employees; 
  5.   private $_position;//标志当前数组指针位置 
  6.   function __construct($name) 
  7.   { 
  8.     $this->_name = $name; 
  9.     $this->employees = array(); 
  10.     $this->_position = 0; 
  11.   } 
  12.   function addEmployee(Employee $e) 
  13.   { 
  14.     $this->_employees[] = $e; 
  15.     echo "员工{$e->getName()}被分配到{$this->_name}中去"; 
  16.   } 
  17.   //实现 Iterator 接口要求实现的方法 
  18.   function current() 
  19.   { 
  20.     return $this->_employees[$this->_position]; 
  21.   } 
  22.   function key() 
  23.   { 
  24.     return $this->_position; 
  25.   } 
  26.   function next() 
  27.   { 
  28.     $this->_position++; 
  29.   } 
  30.   function rewind() 
  31.   { 
  32.     $this->_position = 0; 
  33.   } 
  34.   function valid() 
  35.   { 
  36.     return isset($this->_employees[$this->_position]); 
  37.   } 
  38. } 
  39. //Employee 类同前 
  40. //应用: 
  41. $lsgo = new Department('LSGO实验室'); 
  42. $e1 = new Employee("小锦"); 
  43. $e2 = new Employee("小猪"); 
  44. $lsgo->addEmployee($e1); 
  45. $lsgo->addEmployee($e2); 
  46. echo "LSGO实验室部员情况:"; 
  47. //这里其实遍历的$_employee 
  48. foreach($lsgo as $val){ 
  49.   echo "部员{$val->getName()}"; 
  50. } 

附加:假如现在我们想要知道该部门有几个员工,如果是数组的话,一个 count() 函数就 ok 了,那么我们能不能像上面那样把对象当作数组来处理?SPL标准库中提供了 Countable 接口供我们使用:

  1. class Department implements Iterator,Countable{ 
  2.   //前面同上 
  3.   //实现Countable中要求实现的方法 
  4.   function count(){ 
  5.     return count($this->_employees); 
  6.   } 
  7. } 
  8. //应用: 
  9. echo "员工数量:"; 
  10. echo count($lsgo);

Tags: SPL PHP迭代器

分享到: