PHP Conference Japan 2024

IteratorIterator::getInnerIterator

(PHP 5 >= 5.1.0, PHP 7, PHP 8)

IteratorIterator::getInnerIterator取得內部迭代器

說明

public IteratorIterator::getInnerIterator(): ?Iterator

取得內部迭代器。

參數

此函式沒有參數。

傳回值

傳遞給 IteratorIterator::__construct() 的內部迭代器,或者在沒有內部迭代器時傳回 null

新增註記

使用者貢獻的註記 1 則註記

c dot 1 at smithies dot org
8 年前
`getInnerIterator()` 返回的值實際上是內部迭代器本身,而不是一個副本。使用它時需要注意:例如,在其上呼叫 `next()` 或 `rewind()` 將會推進或重置內部迭代器 — 儘管在您呼叫 `IteratorIterator` 物件的 `next()` 之前不會注意到效果 — 看起來它會快取其 `current()` 和 `key()` 值(截至 PHP v5.5.9)。即使內部迭代器本身有效(即 `valid()` 返回 TRUE),`IteratorIterator` 也不會將自身回報為有效,除非您重設它或呼叫其 `next()` 方法 — 這兩個方法會導致 `IteratorIterator` 將其目前的 `current`、`key` 和 `valid` 狀態與內部迭代器重新同步。

<?php
$ii
= new IteratorIterator(new ArrayIterator(range(1,6)));
$i1 = $ii->getInnerIterator(); // 取得真正的迭代器
$i2 = $ii->getInnerIterator(); // 同上:$i2 === $i1,因此兩者同步。
echo $i1->current(); // 1
echo $i1->key(); // 0
var_dump($ii->valid()); // FALSE
$i1->next(); // 影響 $i2,因為它們是同一個物件
echo $i1->key(); // 1
var_dump($ii->valid()); // 仍然是 FALSE
$ii->rewind(); // 重設 $i1 並同步
echo $ii->key(); // 0,與 $i1->key() 相同
$i1->next(); // 將內部迭代器往前移,現在不同步了
echo $ii->key(); // 仍然是 0
echo $i1->key(); // 1
$ii->next(); // 將內部迭代器往前移並與之同步
echo $ii->key(); // 2
echo $i1->key(); // 2
?>
To Top