A-A+

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

2020年06月20日 我爱编程 暂无评论

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

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

程序运行输出:

  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. string(16) "myIterator::next"
  8. string(17) "myIterator::valid"
  9. string(19) "myIterator::current"
  10. string(15) "myIterator::key"
  11. 输出键值:int(1)
  12. string(14) "second_element"
  13. string(16) "myIterator::next"
  14. string(17) "myIterator::valid"
  15. string(19) "myIterator::current"
  16. string(15) "myIterator::key"
  17. 输出键值:int(2)
  18. string(12) "last_element"
  19. string(16) "myIterator::next"
  20. 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. {
  6.      private $var = array();
  7.      public function __construct($array)
  8.      {
  9.          if (is_array($array)) {
  10.             $this->var = $array;
  11.          }
  12.      }
  13.      public function rewind() {
  14.          echo "倒回第一个元素\n";
  15.         reset($this->var);
  16.      }
  17.      public function current() {
  18.         $var = current($this->var);
  19.          echo "当前元素: $var\n";
  20.          return $var;
  21.      }
  22.      public function key() {
  23.         $var = key($this->var);
  24.          echo "当前元素的键: $var\n";
  25.          return $var;
  26.      }
  27.      public function next() {
  28.         $var = next($this->var);
  29.          echo "移向下一个元素: $var\n";
  30.          return $var;
  31.      }
  32.      public function valid() {
  33.         $var = $this->current() !== false;
  34.          echo "检查有效性: {$var}\n";
  35.          return $var;
  36.      }
  37. }
  38. $values = array(1,2,3);
  39. $it = new MyIterator($values);
  40. foreach ($it as $k => $v) {
  41.      print "此时键值对 -- key $k: value $v\n\n";
  42. }

程序运行结果:

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

给我留言

Copyright © 四季博客 保留所有权利.   Theme  Ality

用户登录