PHP 8.4.0 RC4 available for testing

La classe CachingIterator

(PHP 5, PHP 7, PHP 8)

Introduction

Cet objet supporte les itérations en cache sur un autre itérateur.

Synopsis de la classe

class CachingIterator extends IteratorIterator implements ArrayAccess, Countable, Stringable {
/* Constantes */
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;
/* Méthodes */
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
/* Méthodes héritées */
}

Constantes pré-définies

CachingIterator::CALL_TOSTRING

Convertit tous les éléments en chaines.

CachingIterator::CATCH_GET_CHILD

N'envoie aucune exception lors de la tentative d'accéder à un enfant.

CachingIterator::TOSTRING_USE_KEY

Utilise key lors de la conversion en chaine.

CachingIterator::TOSTRING_USE_CURRENT

Utilise current lors de la conversion en chaine.

CachingIterator::TOSTRING_USE_INNER

Utilise inner lors de la conversion en chaine.

CachingIterator::FULL_CACHE

Met en cache toutes les données lues.

Historique

Version Description
8.0.0 La classe CachingIterator implémente désormais Stringable.

Sommaire

add a note

User Contributed Notes 4 notes

up
10
ahmad dot mayahi at gmail dot com
4 years ago
The only difference between CachingIterator and other Iterators such as ArrayIterator is the hasNext() method.

Since the data will be loaded into the memory, the CachingIterator is able to check whether the given iterator has a next element.

Let's demonstrate this by an example:

<?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
?>

In this example I check whether the iterator has a next value, if so, I append a comma otherwise "and" will be appended to the last element.
up
9
ahmad dot mayahi at gmail dot com
8 years ago
<?php
//This snippet will print out all the cached elements (foreach) .

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

foreach (
$cache as $c) {

}

print_r($cache->getCache());
?>
up
1
jerome at chaman dot ca
4 years ago
"cached iteration over another iterator" means this iterator is always one step behind the inner iterator. In other words, the "first" iteration will yield null:

<?php

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

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

while($cit->hasNext()){

// we start with a "next" since the "first" item is null
$cit->next();
echo
$cit->current(), '<br>';

}
?>

iterating this way gives us an access, ahead, to the future item (aka current item of the inner iterator)
up
0
xedin dot unknown at gmail dot com
4 years ago
Apparently, the `FULL_CACHE` flag automatically cancels the default flag `CALL_TOSTRING`. This is evident when one of the values cannot be converted to string: with the default `CALL_TOSTRING` flag, it would throw an error; without that flag, or with the `FULL_CACHE` flag, it does not.
To Top