php.net

The Traversable interface

(PHP 5, PHP 7, PHP 8)

Introduction

Interface to detect if a class is traversable using foreach.

Abstract base interface that cannot be implemented alone. Instead, it must be implemented by either IteratorAggregate or Iterator.

Interface synopsis

interface Traversable {

}

This interface has no methods; its only purpose is to be the base interface for all traversable classes.

Changelog

Version Description
7.4.0 The Traversable interface can now be implemented by abstract classes. Extending classes must implement Iterator or IteratorAggregate.

Notes

Note:

Internal (built-in) classes that implement this interface can be used in a foreach construct and do not need to implement IteratorAggregate or Iterator.

Note:

Prior to PHP 7.4.0, this internal engine interface couldn't be implemented in PHP scripts. Either IteratorAggregate or Iterator must be used instead.

163

kevinpeno at gmail dot com

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

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

62

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.

Read the original on php.net ↗