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

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

01class myIterator implements Iterator {
02    private $position = 0;
03    private $array = array(
04        "first_element",
05        "second_element",
06        "last_element",
07    ); 
08 
09    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 
39$it = new myIterator;
40 
41foreach($it as $key => $value) {
42    echo '输出键值:';
43    var_dump($key, $value);
44    //echo $key;
45    echo "\n";
46}

程序运行输出:

01string(18) "myIterator::rewind"
02string(17) "myIterator::valid"
03string(19) "myIterator::current"
04string(15) "myIterator::key"
05输出键值:int(0)
06string(13) "first_element"
07 
08string(16) "myIterator::next"
09string(17) "myIterator::valid"
10string(19) "myIterator::current"
11string(15) "myIterator::key"
12输出键值:int(1)
13string(14) "second_element"
14 
15string(16) "myIterator::next"
16string(17) "myIterator::valid"
17string(19) "myIterator::current"
18string(15) "myIterator::key"
19输出键值:int(2)
20string(12) "last_element"
21 
22string(16) "myIterator::next"
23string(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 检查当前位置的有效性

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

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

程序运行结果:

01倒回第一个元素
02当前元素: 1
03检查有效性: 1
04当前元素: 1
05当前元素的键: 0
06此时键值对 -- key 0: value 1
07 
08移向下一个元素: 2
09当前元素: 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检查有效性:

现在就很清晰了吧?

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值