A interface Traversable

(PHP 5, PHP 7, PHP 8)

Introdução

Interface para detectar se uma classe é percorrível utilizando o foreach.

Interface básica abstrata que não pode ser implementada sozinha. Ao invés, deve ser implementada as interfaces IteratorAggregate ou Iterator.

Resumo da Interface

interface Traversable {
}

Esta interface não possui métodos, seu único propósito é de servir como interface base para todas as classes percorríveis.

Registro de Alterações

Versão Descrição
7.4.0 A interface Traversable agora pode ser implementada em classes abstratas. Classes estendidas precisam implementar Iterator ou IteratorAggregate.

Notas

Nota:

Classes internas (built-in) que implementam essa interface podem ser utilizadas em um construtor de linguagem foreach e não precisam implementar as interfaces IteratorAggregate ou Iterator.

Nota:

Anteriormente ao PHP 7.4.0, esta funcionalidade interna não podia ser implementada em scripts PHP. Ou IteratorAggregate ou Iterator precisavam ser utilizados.

adicione uma nota

Notas Enviadas por Usuários (em inglês) 4 notes

up
165
kevinpeno at gmail dot com
14 years ago
While you cannot implement this interface, you can use it in your checks to determine if something is usable in for each. Here is what I use if I'm expecting something that must be iterable via foreach.

<?php
if( !is_array( $items ) && !$items instanceof Traversable )
//Throw exception here
?>
up
101
cobaltbluedw
8 years ago
NOTE: While objects and arrays can be traversed by foreach, they do NOT implement "Traversable", so you CANNOT check for foreach compatibility using an instanceof check.

Example:

$myarray = array('one', 'two', 'three');
$myobj = (object)$myarray;

if ( !($myarray instanceof \Traversable) ) {
print "myarray is NOT Traversable";
}
if ( !($myobj instanceof \Traversable) ) {
print "myobj is NOT Traversable";
}

foreach ($myarray as $value) {
print $value;
}
foreach ($myobj as $value) {
print $value;
}

Output:
myarray is NOT Traversable
myobj is NOT Traversable
one
two
three
one
two
three
up
66
douglas at reith dot com dot au
7 years ago
The PHP7 iterable pseudo type will match both Traversable and array. Great for return type-hinting so that you do not have to expose your Domain to Infrastructure code, e.g. instead of a Repository returning a Cursor, it can return hint 'iterable':
<?php
UserRepository
::findUsers(): iterable
?>

Link: http://php.net/manual/en/migration71.new-features.php#migration71.new-features.iterable-pseudo-type

Also, instead of:
<?php
if( !is_array( $items ) && !$items instanceof Traversable )
//Throw exception here
?>

You can now do with the is_iterable() method:
<?php
if ( !is_iterable( $items ))
//Throw exception here
?>

Link: http://php.net/manual/en/function.is-iterable.php
up
64
ajf at ajf dot me
9 years ago
Note that all objects can be iterated over with foreach anyway and it'll go over each property. This just describes whether or not the class implements an iterator, i.e. has custom behaviour.
To Top