>  기사  >  백엔드 개발  >  PHP의 IteratorIterator 이해(코드 예)

PHP의 IteratorIterator 이해(코드 예)

不言
不言앞으로
2018-10-25 16:51:512499검색

이 기사의 내용은 PHP의 IteratorIterator에 대한 이해(코드 예제)입니다. 필요한 친구들이 참고할 수 있기를 바랍니다.

php의 IteratorIterator에 대한 개인적인 이해

최근에 laravel의 소스 코드를 다시 다루기 시작했는데 사용하지 않아서 잊어버릴 뻔했습니다. 1년 넘게 시청할 때마다 많은 것을 배울 수 있습니다. 이해가 되지 않으면 빨리 매뉴얼을 확인하세요. 구성 파일(config/*.php)을 로드하는 부분을 보았는데, 코드에서 spl 클래스 라이브러리와 인터페이스가 광범위하게 사용됩니다. 오늘은 IteratorIterator 클래스에 대해 이야기할 것입니다. 별로 똑똑하지 않습니다. Genius에는 몇 가지 단서가 있으며 다음은 이에 대한 개인적인 이해입니다.

IteratorIterator 소개

IteratorIterator는 반복자 래퍼입니다. 물론 반복자 자체이기도 합니다. Outer라고 가정하면 이를 인스턴스화할 때 Traversable 인터페이스 유형(Inner라고 가정)을 구현하는 반복기 인스턴스를 전달해야 합니다. 물론 Outer의 getInnerIterator 메서드를 통해 이 들어오는 반복기 매개 변수 Inner를 가져올 수 있습니다. Outer의 rewind(), next(), valid(), current() 및 key() 메서드를 통해 내부 반복기 Inner를 처리할 수 있습니다.

이해해야 할 핵심 사항

  1. Outer를 순회하는 과정에서 Outer는 그냥 rewind(), next(), valid(), current ( ) 및 key() 을 내부 반복자 Inner로 전달합니다.

  2. 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 &#39;call &#39; . __METHOD__ . &#39;<br>&#39;;
        reset($this->dates);
    }

    public function valid() 
    {
        echo &#39;call &#39; . __METHOD__ . &#39;<br>&#39;;
        if ($this->position >= count($this->dates)) {
            # code...
            return false;
        }
        return true;
    }

    public function current()
    {
        echo &#39;call &#39; . __METHOD__ . &#39;<br>&#39;;
        return $this->dates[$this->position];
    }

    public function key()
    {
        echo &#39;call &#39; . __METHOD__ . &#39;<br>&#39;;
        return $this->position;
    }

    public function next()
    {
        echo &#39;call &#39; . __METHOD__ . &#39;<br>&#39;;
        ++$this->position;
    }}class OuterIterator extends \IteratorIterator{
    function rewind()
    {
        echo __METHOD__ .  &#39;<br>&#39;;
        return parent::rewind();
    }
    
    function valid()
    {
        echo __METHOD__ . &#39;<br>&#39;;
        return parent::valid();
    }
    
    function current()
    {
        echo __METHOD__ . &#39;<br>&#39;;
        return parent::current() . &#39;_suffix&#39;;
    }
    
    function key()
    {
        echo __METHOD__ . &#39;<br>&#39;;
        return parent::key() ;
    }
    
    function next()
    {
        echo __METHOD__ . &#39;<br>&#39;;
        return parent::next() ;
    }
    
    function getInnerIterator() 
    {
        echo __METHOD__ . &#39;<br>&#39;;
        return parent::getInnerIterator();
    }}$tmpArr = array(
    &#39;2018-10-01&#39;,
    &#39;2018-10-02&#39;,
    //&#39;2018-10-03&#39;,);$inner = new InnerIterator($tmpArr);$outer = new OuterIterator($inner);foreach ($outer as $key => $value) {
    # code...
    echo $key , &#39;=>&#39; , $value . &#39;<hr>&#39;;}

실행 결과:

young\OuterIterator::rewind
call young\InnerIterator::rewind
call young\InnerIterator::valid
call young\InnerIterator::current
call young\InnerIterator::key
young\OuterIterator::valid
young\OuterIterator::current
young\OuterIterator::key
0=>2018-10-01_suffix
young\OuterIterator::next
call young\InnerIterator::next
call young\InnerIterator::valid
call young\InnerIterator::current
call young\InnerIterator::key
young\OuterIterator::valid
young\OuterIterator::current
young\OuterIterator::key
1=>2018-10-02_suffix
young\OuterIterator::next
call young\InnerIterator::next
call young\InnerIterator::valid
 young\OuterIterator::valid
 object(young\InnerIterator)#1 (2) { 
[“dates”:“young\InnerIterator”:private]=> array(2) { [0]=> 
string(10) “2018-10-01” [1]=> string(10) “2018-10-02” } 
[“position”:“young\InnerIterator”:private]=> int(2) }
# 🎜🎜#결과분석

Outer를 반복할 때마다 먼저 자체 메서드를 호출한 다음 이를 Inner로 전달합니다.

Outer의 내부 메소드의 반환 값은 해당 메소드를 기준으로 한 Inner의 반환 값을 기반으로 합니다.
Outer 메소드에서는 Inner의 반환값을 논리적으로 처리할 수 있습니다.
Inner의 유효한 값이 false를 반환하면 외부 Outer도 반복을 중지합니다.
Outer의 메소드에 의한 반환 값 수정은 Inner에 영향을 미치지 않습니다.
Outer의 메소드는 반복 프로세스 중에 getInnerIterator 메소드를 실행하지 않습니다. 이는 단지 Inner 메소드를 가져오기 위한 호출 인터페이스일 뿐입니다.

약간의 추가

온라인에서 정보를 탐색할 때 이러한 의심을 보곤 했습니다

//假如这里还是使用了上面的两个类代码
<?php
namespace young;
class InnerIterator implements \Iterator
{
    //code 这里的代码假如和上面的一样
}
class OuterIterator extends \IteratorIterator
{
    //code 这里的代码假如和上面的一样
}
$outer->valid();           //false
$outer->current();         // _suffix  问题一
$outer->rewind();    
$outer->valid();            //true
$outer->current();         //2018-10-01_suffix
$outer->next()
$outer->rewind();
$outer->current();         //2018-10-02_suffix  问题二

여기에 두 가지 질문이 있습니다.

# 🎜 🎜#

    질문 1, 현재 값이 없고 유효한 이유가 false인 이유
  1. 질문 2, 다음 및 되감기 이후 왜, 현재 입니다. 두 번째 값
  2. 위의 실행 결과에서 $outer는 rewind를 실행하지 않고 $inner도 실행하지 않으므로 valid는 false와 current를 반환합니다. _suffix는 제가 직접 붙인 것 뿐입니다.
두 번째 문제도 매우 이상합니다. $inner의 포인터가 앞으로 이동하는 한, 즉 $inner의 위치 속성은 첫 번째 다음부터 1이 됩니다. ., 되감아도 위치는 여전히 1이므로 약간 혼란스럽습니다. . .

그래서 $outer 순회 작업을 수행하면 두 번째로 값이 출력되지 않습니다. 두 번째로 되감기 작업을 수행하더라도 두 번째에는 이 작업이 쓸모가 없습니다~~~#🎜 🎜 #

위 내용은 PHP의 IteratorIterator 이해(코드 예)의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
이 기사는 csdn.net에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제