この記事の内容はphpのIteratorIteratorの理解(コード例)であり、一定の参考価値があるので、困っている友人は参考にしていただければ幸いです。
最近またlaravelのソースコードをいじり始めたのですが、1年以上使っていなかったのでほとんど忘れていました。見るたびにそこから始めます、中学校でたくさん習いました、分からないことがあればマニュアルで調べてください。設定ファイル (config/*.php) を読み込む部分を見ました。コード内では spl クラス ライブラリとインターフェイスが多用されています。今日は IteratorIterator クラスについて話します。インターネット上の情報が少なすぎるので、私はあまり頭が良くありません。何度かやりました。Genius にはいくつかの手がかりがあり、以下はそれについての私の個人的な理解です。
IteratorIterator はイテレータ ラッパーであり、もちろんイテレータ自体でもあります。それ (Outer と呼ばれると仮定します) は、インスタンス化するときに、Traversable インターフェイス タイプ (Inner と呼ばれると仮定します) を実装するイテレータ インスタンスを渡す必要があります。もちろん、この受信イテレータ パラメータ Inner は、Outer の getInnerIterator メソッドを通じて取得できます。内部反復子 Inner は、Outer の rewind()、next()、valid()、current()、および key() メソッドを通じて処理できます。
Outer、Outer をトラバースするプロセスでは、rewind()、next()、valid()、current()、および key() だけを実行します。あらゆる呼び出し は、内部反復子 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 の戻り値に対して論理処理を行うことができます。
Inner の valid が 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 问题二
ここで 2 つの質問があります。
以上がPHP の IteratorIterator の理解 (コード例)の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。