PHP 8.3.4 Released!

La interfaz Traversable

(PHP 5, PHP 7, PHP 8)

Introducción

Interfaz para detectar si una clase puede recorrerse mediante foreach.

Una interfaz abstracta base no puede ser implementada sola. En su lugar, debe ser implementada con IteratorAggregate o con Iterator.

Sinopsis de la Interfaz

interface Traversable {
}

Esta interfaz no tiene métodos, su único propósito es ser la base para todas las clases atravesables.

Historial de cambios

Versión Descripción
7.4.0 La interfaz Traversable ahora puede ser implementada por clases abstractas. Las clases que la extiendan deben implementar Iterator o IteratorAggregate.

Notas

Nota:

Las clases internas que implementan esta interfaz pueden ser usadas en una construcción foreach y no necesitan implementar IteratorAggregate o Iterator.

Nota:

Antes de PHP 7.4.0, esta interfaz interna del motor no podía ser implementada en scripts PHP. Se debe usar IteratorAggregate o Iterator deben usarse en su lugar.

add a note

User Contributed Notes 5 notes

up
161
kevinpeno at gmail dot com
13 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
99
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
64
douglas at reith dot com dot au
6 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
63
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.
up
-8
alan dot bem at gmail dot com
5 years ago
Actually you can use `Traversable` within your php scripts - you can use it to enforce iterability on user-land objects.

<?php

interface Stream implements \Traversable {}

class
InMemoryStream implements IteratorAggregate, Stream
{
public function
getIterator() {}
}

$stream = new InMemoryStream();
?>

In case you'd forgot about implementing `IteratorAggregate` or `Iterator` interfaces, fatal error will be raised when instantiating objects in question.

<?php

interface Stream implements \Traversable {}

class
InMemoryStream implements Stream {}

$stream = new InMemoryStream(); // Fatal error: Class InMemoryStream must implement interface Traversable as part of either Iterator or IteratorAggregate in Unknown on line 0
?>
To Top