CachingIterator 类

(PHP 5, PHP 7, PHP 8)

介绍

此对象支持对另一个迭代器的缓存迭代。

类概要

class CachingIterator extends IteratorIterator implements ArrayAccess, Countable, Stringable {
/* 常量 */
public const int CALL_TOSTRING;
public const int CATCH_GET_CHILD;
public const int TOSTRING_USE_KEY;
public const int TOSTRING_USE_INNER;
public const int FULL_CACHE;
/* 方法 */
public __construct(Iterator $iterator, int $flags = CachingIterator::CALL_TOSTRING)
public count(): int
public current(): mixed
public getCache(): array
public getFlags(): int
public hasNext(): bool
public key(): scalar
public next(): void
public offsetExists(string $key): bool
public offsetGet(string $key): mixed
public offsetSet(string $key, mixed $value): void
public offsetUnset(string $key): void
public rewind(): void
public setFlags(int $flags): void
public __toString(): string
public valid(): bool
/* 继承的方法 */
}

预定义常量

CachingIterator::CALL_TOSTRING

将每个元素转换为字符串。

CachingIterator::CATCH_GET_CHILD

在访问子节点时不要抛出异常。

CachingIterator::TOSTRING_USE_KEY

使用 key 转换为字符串。

CachingIterator::TOSTRING_USE_CURRENT

使用 current 转换为字符串。

CachingIterator::TOSTRING_USE_INNER

使用 inner 转换为字符串。

CachingIterator::FULL_CACHE

缓存所有读取数据。

变更日志

版本 描述
8.0.0 CachingIterator 现在实现了 Stringable

目录

添加注释

用户贡献的注释 4 个注释

ahmad dot mayahi at gmail dot com
4 年前
CachingIterator 与其他迭代器(如 ArrayIterator)之间的唯一区别是 hasNext() 方法。

由于数据将被加载到内存中,因此 CachingIterator 能够检查给定迭代器是否具有下一个元素。

让我们通过一个例子来演示这一点

<?php
$iterator
= new CachingIterator(new ArrayIterator(['C', 'C++', 'C#', 'PHP', 'Python', 'Go', 'Ruby']));

foreach (
$iterator as $item) {
if (
$iterator->hasNext()) {
echo
$item.', ';
} else {
echo
'and '.$item;
}
}

// C, C++, C#, PHP, Python, Go, and Ruby
?>

在这个例子中,我检查迭代器是否还有下一个值,如果有,我追加一个逗号,否则会将“and”追加到最后一个元素。
ahmad dot mayahi at gmail dot com
7 年前
<?php
// 此代码片段将打印出所有缓存的元素(foreach)。

$cache = new CachingIterator(new ArrayIterator(range(1,100)), CachingIterator::FULL_CACHE);

foreach (
$cache as $c) {

}

print_r($cache->getCache());
?>
jerome at chaman dot ca
4 年前
“对另一个迭代器的缓存迭代”意味着此迭代器始终落后于内部迭代器一步。换句话说, “第一次”迭代将产生空值。

<?php

$cit
= new CachingIterator( new ArrayIterator( [ 'a', 'b', 'c'] ) );

echo
$cit->current() ); // null
echo $cit->getInnerIterator()->current() ); // "a"

while($cit->hasNext()){

// 我们从“下一个”开始,因为“第一个”项目是空值
$cit->next();
echo
$cit->current(), '<br>';

}
?>

以这种方式迭代可以让我们提前访问未来的项目(即内部迭代器的当前项目)。
xedin dot unknown at gmail dot com
4 年前
显然,`FULL_CACHE` 标志会自动取消默认标志 `CALL_TOSTRING`。当其中一个值无法转换为字符串时,这一点很明显:使用默认的 `CALL_TOSTRING` 标志,它会抛出错误;如果没有该标志,或者有 `FULL_CACHE` 标志,它就不会抛出错误。
To Top