P

PHP 小白 学习 生成器接口(部分)

xyj2156 PHP 2018-03-26

最初感觉

看到官方概念,第一句,这是什么?性能大大提升,哇,生成器,这么牛逼,很高大上。

其实也真的很牛。

自己测试代码(结合官方文档和博客)

首先,看看文档当中继承了 Iterator 这个接口

示例代码:
class MyIterator implements Iterator {
    private $arr = [];
    
    public function __construct(Array $arr) {
        $this -> arr = $arr;
    }
    
    public function rewind() {
        var_dump(__METHOD__);
        reset($this -> arr);
    }
    
    public function current() {
        var_dump(__METHOD__);
        return current($this->arr);
    }
    
    public function key() {
        var_dump(__METHOD__);
        return key($this->arr);
    }
    
    public function next() {
        var_dump(__METHOD__);
        return next($this->arr);
    }
    
    public function valid() {
        var_dump(__METHOD__);
        return array_key_exists(key($this -> arr), $this->arr);
    }
    
}

$it = new MyIterator([
        'e' => 3,
        'q' => 1,
        't' => 23,
        '2' => 3,
    ]);

foreach($it as $key => $value) {
    echo "\n";
    var_dump($key, $value);
}
子会输出一下内容
string(18) "MyIterator::rewind"
string(17) "MyIterator::valid"
string(19) "MyIterator::current"
string(15) "MyIterator::key"

string(1) "e"
int(3)
string(16) "MyIterator::next"
string(17) "MyIterator::valid"
string(19) "MyIterator::current"
string(15) "MyIterator::key"

string(1) "q"
int(1)
string(16) "MyIterator::next"
string(17) "MyIterator::valid"
string(19) "MyIterator::current"
string(15) "MyIterator::key"

string(1) "t"
int(23)
string(16) "MyIterator::next"
string(17) "MyIterator::valid"
string(19) "MyIterator::current"
string(15) "MyIterator::key"

int(2)
int(3)
string(16) "MyIterator::next"
string(17) "MyIterator::valid"

学到了

上面的 foreach 可以写作下面的样子

for ($it -> rewind(); $it -> valid(); $it -> next()){
    $val = $it -> current();
    $key = $it -> key();
    echo $key,"\n",$val;
}

这样我就理解了。

PREV
PHPstorm 配置xdebug 调试 TP3.2
NEXT
PHP 实现 数组转换成可以遍历的对象,既可以使用数组方式访问,又可以按照之前的数组形式访问

评论(0)

评论已关闭