이 기사의 내용은 PHP의 IteratorIterator에 대한 이해(코드 예제)입니다. 필요한 친구들이 참고할 수 있기를 바랍니다.
최근에 laravel의 소스 코드를 다시 다루기 시작했는데 사용하지 않아서 잊어버릴 뻔했습니다. 1년 넘게 시청할 때마다 많은 것을 배울 수 있습니다. 이해가 되지 않으면 빨리 매뉴얼을 확인하세요. 구성 파일(config/*.php)을 로드하는 부분을 보았는데, 코드에서 spl 클래스 라이브러리와 인터페이스가 광범위하게 사용됩니다. 오늘은 IteratorIterator 클래스에 대해 이야기할 것입니다. 별로 똑똑하지 않습니다. Genius에는 몇 가지 단서가 있으며 다음은 이에 대한 개인적인 이해입니다.
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>';}
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 问题二여기에 두 가지 질문이 있습니다.
# 🎜 🎜#
그래서 $outer 순회 작업을 수행하면 두 번째로 값이 출력되지 않습니다. 두 번째로 되감기 작업을 수행하더라도 두 번째에는 이 작업이 쓸모가 없습니다~~~#🎜 🎜 #
위 내용은 PHP의 IteratorIterator 이해(코드 예)의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!