[摘要]本篇文章给大家带来的内容是关于php中IteratorIterator的理解(代码示例),有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助。php之IteratorIterator个人理...
本篇文章给大家带来的内容是关于php中IteratorIterator的理解(代码示例),有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助。
								
							
php之IteratorIterator个人理解
最近有重新开始捣鼓laravel的源码了,一年多没用实在是忘的差不多了,每次看都会从中学到很多,不懂就赶紧查手册。看到加载配置文件的部分(config/*.php),代码中大量使用spl类库和接口,今天就来扯一下IteratorIterator类,网上资料太少了,加上本人也不是怎么聪明,搞了好几天才有点眉目,以下是对它的个人理解。
IteratorIterator简介
IteratorIterator是一个迭代器包装器,当然它本身也是迭代器。它(假定它叫Outer)在实例化时必须传入一个实现了Traversable接口类型的迭代器实例(假定它叫Inner),当然你可以通过Outer的getInnerIterator方法获取到这个传入的迭代器参数Inner。你可以通过Outer的rewind(),next(),valid(),current()和key()方法对内部迭代器Inner进行处理。
重点理解
- 在遍历Outer的过程中,Outer只是将rewind(),next(),valid(),current()和key()的任何调用转发给内部迭代器Inner。 
- Outer可以对转发返回的结果进行包装,但这并不会对Inner产生任何影响。 
代码演示
<?php
namespace young;class InnerIterator implements \Iterator{
    private $dates;
    private $position;
    public function __construct($dates = [])
    {
        $this->dates    = $dates;
        $this->position = 0;
    }
    public function rewind()
    {
        echo 'call ' . __METHOD__ . '<br>';
        reset($this->dates);
    }
    public function valid() 
    {
        echo 'call ' . __METHOD__ . '<br>';
        if ($this->position >= count($this->dates)) {
            # code...
            return false;
        }
        return true;
    }
    public function current()
    {
        echo 'call ' . __METHOD__ . '<br>';
        return $this->dates[$this->position];
    }
    public function key()
    {
        echo 'call ' . __METHOD__ . '<br>';
        return $this->position;
    }
    public function next()
    {
        echo 'call ' . __METHOD__ . '<br>';
        ++$this->position;
    }}class OuterIterator extends \IteratorIterator{
    function rewind()
    {
        echo __METHOD__ .  '<br>';
        return parent::rewind();
    }
    
    function valid()
    {
        echo __METHOD__ . '<br>';
        return parent::valid();
    }
    
    function current()
    {
        echo __METHOD__ . '<br>';
        return parent::current() . '_suffix';
    }
    
    function key()
    {
        echo __METHOD__ . '<br>';
        return parent::key() ;
    }
    
    function next()
    {
        echo __METHOD__ . '<br>';
        return parent::next() ;
    }
    
    function getInnerIterator() 
    {
        echo __METHOD__ . '<br>';
        return parent::getInnerIterator();
    }}$tmpArr = array(
    '2018-10-01',
    '2018-10-02',
    //'2018-10-03',);$inner = new InnerIterator($tmpArr);$outer = new OuterIterator($inner);foreach ($outer as $key => $value) {
    # code...
    echo $key , '=>' , $value . '<hr>';}