L'interface Traversable

(PHP 5, PHP 7, PHP 8)

Introduction

Interface permettant de dĂ©tecter si une classe peut ĂȘtre parcourue en utilisant foreach.

L'interface de base est abstraite et ne peut ĂȘtre implĂ©mentĂ©e seule. Elle doit ĂȘtre implĂ©mentĂ©e par soit IteratorAggregate, soit Iterator.

Sommaire de l'Interface

interface Traversable {
}

Cette interface n'a pas de mĂ©thode ; son seul but est d'ĂȘtre l'interface de base pour toutes les classes permettant de parcourir des objets.

Historique

Version Description
7.4.0 L'interface Traversable peut dĂ©sormais ĂȘtre implĂ©mentĂ©e par des classes abstraites. Les classes Ă©tendant celles-ci doivent implĂ©menter soit Iterator ou IteratorAggregate.

Notes

Note:

Les classes internes qui implĂ©mentent cette interface peuvent ĂȘtre utilisĂ©es dans une structure foreach et n'ont pas besoin d'implĂ©menter IteratorAggregate ou Iterator.

Note:

Avant PHP 7.4.0, cette interface interne au moteur ne pouvait pas ĂȘtre implĂ©mentĂ©e dans des scripts PHP. Soit IteratorAggregate ou Iterator doit ĂȘtre utilisĂ© Ă  la place.

add a note

User Contributed Notes 4 notes

up
167
kevinpeno at gmail dot com ¶
15 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
104
cobaltbluedw ¶
10 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
68
douglas at reith dot com dot au ¶
8 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 ¶
11 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.