看看PHP迭代器的内部执行过程

2014 年 5 月 22 日3040

看看PHP迭代器的内部执行过程

发布者:chinaitlab

 日期:

2014-05-18 05:56:24 浏览次数:0 (共有_条评论)

查看评论 | 我要评论

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

  <?php

  class myIterator implements Iterator {

  private $position = 0;

  private $array = array(

  "first_element",

  "second_element",

  "last_element",

  );

  public function __construct() {

  $this->position = 0;

  }

  function rewind() {

  var_dump(__METHOD__);

  $this->position = 0;

  }

  function current() {

  var_dump(__METHOD__);

  return $this->array[$this->position];

  }

  function key() {

  var_dump(__METHOD__);

  return $this->position;

  }

  function next() {

  var_dump(__METHOD__);

  ++$this->position;

  }

  function valid() {

  var_dump(__METHOD__);

  return isset($this->array[$this->position]);

  }

  }

  $it = new myIterator;

  foreach($it as $key => $value) {

  echo '输出键值:';

  var_dump($key, $value);

  //echo $key;

  echo "\n";

  }

  程序运行输出:

  string(18) "myIterator::rewind"

  string(17) "myIterator::valid"

  string(19) "myIterator::current"

  string(15) "myIterator::key"

  输出键值:int(0)

  string(13) "first_element"

  string(16) "myIterator::next"

  string(17) "myIterator::valid"

  string(19) "myIterator::current"

  string(15) "myIterator::key"

  输出键值:int(1)

  string(14) "second_element"

  string(16) "myIterator::next"

  string(17) "myIterator::valid"

  string(19) "myIterator::current"

  string(15) "myIterator::key"

  输出键值:int(2)

  string(12) "last_element"

  string(16) "myIterator::next"

  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 检查当前位置的有效性

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

  <?php

  /**

  * @author nicesunboy@gmail.com

  */

  class MyIterator implements Iterator

  {

  private $var = array();

  public function __construct($array)

  {

  if (is_array($array)) {

  $this->var = $array;

  }

  }

  public function rewind() {

  echo "倒回第一个元素\n";

  reset($this->var);

  }

  public function current() {

  $var = current($this->var);

  echo "当前元素: $var\n";

  return $var;

  }

  public function key() {

  $var = key($this->var);

  echo "当前元素的键: $var\n";

  return $var;

  }

  public function next() {

  $var = next($this->var);

  echo "移向下一个元素: $var\n";

  return $var;

  }

  public function valid() {

  $var = $this->current() !== false;

  echo "检查有效性: {$var}\n";

  return $var;

  }

  }

  $values = array(1,2,3);

  $it = new MyIterator($values);

  foreach ($it as $k => $v) {

  print "此时键值对 -- key $k: value $v\n\n";

  }

  程序运行结果:

  倒回第一个元素

  当前元素: 1

  检查有效性: 1

  当前元素: 1

  当前元素的键: 0

  此时键值对 -- key 0: value 1

  移向下一个元素: 2

  当前元素: 2

  检查有效性: 1

  当前元素: 2

  当前元素的键: 1

  此时键值对 -- key 1: value 2

  移向下一个元素: 3

  当前元素: 3

  检查有效性: 1

  当前元素: 3

  当前元素的键: 2

  此时键值对 -- key 2: value 3

  移向下一个元素:

  当前元素:

  检查有效性:

  现在就很清晰了吧?

>>更多交流,请到ChinaUnix【Linux系统管理论坛】:http://http://www.zjjv.com///bbs/forum-2-1.html

关键词:

相关文章

网友评论

已有0位网友发表了看法

0 0