PHP 5.6.0RC3 is available

Traversable インターフェイス

(PHP 5 >= 5.0.0)


そのクラスの中身が foreach を使用してたどれるかどうかを検出するインターフェイスです。

これは抽象インターフェイスであり、単体で実装することはできません。 IteratorAggregate あるいは Iterator を実装しなければなりません。


このインターフェイスを実装した内部クラス (組み込みクラス) は foreach で使用することができます。 IteratorAggregateIterator を実装する必要はありません。


これは内部エンジンのインターフェイスであり、PHP スクリプトないで実装することはできません。 そのかわりに IteratorAggregate あるいは Iterator を使用しなければなりません。 Traversable を継承したインターフェイスを実装するときは、 implements 句の中でそのインターフェイスより前に IteratorAggregateIterator を指定しておきましょう。


Traversable {

このインターフェイスにはメソッドがありません。 traverse 可能なすべてのクラス用の基底インターフェイスとしてのみ存在しています。

add a note add a note

User Contributed Notes 2 notes

kevinpeno at gmail dot com
3 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.

if( !is_array( $items ) && !$items instanceof Traversable )
//Throw exception here
mathdegiovani at gmail dot com
4 months ago
Note that instanceof Traversable does not work for stdclass objects, so if you are this check (as @kevinpeno) to decide whether you can iterate, it will fail for direct instances.

In particular:


= new stdclass();
$obj->prop = 'hello';
var_dump($obj instanceof Traversable);
//outputs bool(false)

My own solution is to check whether the object also descends from stdclass, but that also fails to catch some objects that are iterable.
To Top