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

PHP迭代器的内部执行过程详解

发布:smiling 来源: PHP粉丝网  添加日期:2020-06-18 10:15:07 浏览: 评论:0 

下面我们来了解如何实现一个自定义的迭代器,然后再开始慢慢理解迭代器的内部工作原理。先来看一个官方的例子。

  1. class myIterator implements Iterator { 
  2.     private $position = 0; 
  3.     private $array = array
  4.         "first_element"
  5.         "second_element"
  6.         "last_element"
  7.     );   
  8.  
  9.     public function __construct() { 
  10.         $this->position = 0; 
  11.     } 
  12.  
  13.     function rewind() { 
  14.         var_dump(__METHOD__); 
  15.         $this->position = 0; 
  16.     } 
  17.  
  18.     function current() { 
  19.         var_dump(__METHOD__); 
  20.         return $this->array[$this->position]; 
  21.     } 
  22.  
  23.     function key() { 
  24.         var_dump(__METHOD__); 
  25.         return $this->position; 
  26.     } 
  27.  
  28.     function next() { 
  29.         var_dump(__METHOD__); 
  30.         ++$this->position; 
  31.     } 
  32.  
  33.     function valid() { 
  34.         var_dump(__METHOD__); 
  35.         return isset($this->array[$this->position]); 
  36.     } 
  37.  
  38. $it = new myIterator; 
  39.  
  40. foreach($it as $key => $value) { 
  41.  echo '输出键值:'
  42.     var_dump($key$value); 
  43.  //echo $key; 
  44.     echo "\n"

程序运行输出:

  1. string(18) "myIterator::rewind" 
  2. string(17) "myIterator::valid" 
  3. string(19) "myIterator::current" 
  4. string(15) "myIterator::key" 
  5. 输出键值:int(0) 
  6. string(13) "first_element" 
  7.  
  8. string(16) "myIterator::next" 
  9. string(17) "myIterator::valid" 
  10. string(19) "myIterator::current" 
  11. string(15) "myIterator::key" 
  12. 输出键值:int(1) 
  13. string(14) "second_element" 
  14.  
  15. string(16) "myIterator::next" 
  16. string(17) "myIterator::valid" 
  17. string(19) "myIterator::current" 
  18. string(15) "myIterator::key" 
  19. 输出键值:int(2) 
  20. string(12) "last_element" 
  21.  
  22. string(16) "myIterator::next" 
  23. string(17) "myIterator::valid" 

一般的迭代器内部需要下面的方法:

Iterator::current — Return the current element 返回当前元素

Iterator::key — Return the key of the current element 返回当前元素的键

Iterator::next — Move forward to next element 移向下一个元素

Iterator::rewind — Rewind the Iterator to the first element 重新回到第一个元素

Iterator::valid — Checks if current position is valid 检查当前位置的有效性

如果不是很清楚迭代器的内容工作流程,可以查看下面的迭代器对数组的遍历过程:

  1. /** 
  2. * @author 简明现代魔法 http://www.phpfensi.com 
  3. */ 
  4. class MyIterator implements Iterator 
  5.      private $var = array(); 
  6.  
  7.      public function __construct($array
  8.      { 
  9.          if (is_array($array)) { 
  10.             $this->var = $array
  11.          } 
  12.      } 
  13.  
  14.      public function rewind() { 
  15.          echo "倒回第一个元素\n"
  16.         reset($this->var); 
  17.      } 
  18.  
  19.      public function current() { 
  20.         $var = current($this->var); 
  21.          echo "当前元素: $var\n"
  22.          return $var
  23.      } 
  24.  
  25.      public function key() { 
  26.         $var = key($this->var); 
  27.          echo "当前元素的键: $var\n"
  28.          return $var
  29.      } 
  30.  
  31.      public function next() { 
  32.         $var = next($this->var); 
  33.          echo "移向下一个元素: $var\n"
  34.          return $var
  35.      } 
  36.  
  37.      public function valid() { 
  38.         $var = $this->current() !== false; 
  39.          echo "检查有效性: {$var}\n"
  40.          return $var
  41.      } 
  42.  
  43. $values = array(1,2,3); 
  44. $it = new MyIterator($values); 
  45.  
  46. foreach ($it as $k => $v) { 
  47.      print "此时键值对 -- key $k: value $v\n\n"

程序运行结果:

  1. 倒回第一个元素 
  2. 当前元素: 1 
  3. 检查有效性: 1 
  4. 当前元素: 1 
  5. 当前元素的键: 0 
  6. 此时键值对 -- key 0: value 1 
  7.  
  8. 移向下一个元素: 2 
  9. 当前元素: 2 
  10. 检查有效性: 1 
  11. 当前元素: 2 
  12. 当前元素的键: 1 
  13. 此时键值对 -- key 1: value 2 
  14.  
  15. 移向下一个元素: 3 
  16. 当前元素: 3 
  17. 检查有效性: 1 
  18. 当前元素: 3 
  19. 当前元素的键: 2 
  20. 此时键值对 -- key 2: value 3 
  21.  
  22. 移向下一个元素:  
  23. 当前元素:  
  24. 检查有效性:  
现在就很清晰了吧?

Tags: PHP迭代器

分享到: