认识php的iterator interface

2017-07-24  本文已影响0人  misaka去年夏天

简单来说,PHP的iterator,就是扩展了foreach循环对象的功能。你可以在循环对象时,自定义一些属性和方法,让对象也能像数组一样foreach循环。

<?php

class It implements Iterator {

    private $offset;
    private $array = [
        'first val',
        'second val',
        'third val'
    ];

    public function __construct() {
        $this->offset = 0;
    }

    /**
     * 第一次循环时的第一步,调用此方法,设置offset为0
     * @return [type] [description]
     */
    public function rewind() {
        var_dump(__METHOD__);
        echo "<br />";
        $this->offset = 0;
    }

    /**
     * 每次循环的第二步,调用此方法,检查offset是否存在,不存在也就是offset到尽头时,返回FALSE并终止循环
     * @return [type] [description]
     */
    public function valid() {
        var_dump(__METHOD__);
        echo "<br />";
        return isset($this->array[$this->offset]);
    }

    /**
     * 每次循环的第三步,调用此方法,返回当前offset对应的value
     * @return [type] [description]
     */
    public function current() {
        var_dump(__METHOD__);
        echo "<br />";
        return $this->array[$this->offset];
    }

    /**
     * 每次循环的第四步,调用此方法,返回当前offset值
     * @return [type] [description]
     */
    public function key() {
        var_dump(__METHOD__);
        echo "<br />";
        return $this->offset;
    }

    /**
     * 从第二次开始循环开始,每一次循环的第一步,调用此方法,让offset自增
     * @return function [description]
     */
    public function next() {
        var_dump(__METHOD__);
        echo "<br />";
        ++$this->offset;
    }


}

$it = new It();

foreach ($it as $key => $value) {
    echo $key . ' :' . $value;
    echo "<br /><br />";
}

结果如下:

string(10) "It::rewind" 
string(9) "It::valid" 
string(11) "It::current" 
string(7) "It::key" 
0 :first val

string(8) "It::next" 
string(9) "It::valid" 
string(11) "It::current" 
string(7) "It::key" 
1 :second val

string(8) "It::next" 
string(9) "It::valid" 
string(11) "It::current" 
string(7) "It::key" 
2 :third val

string(8) "It::next" 
string(9) "It::valid" 
上一篇 下一篇

猜你喜欢

热点阅读