php[world] 2015 Call for Speakers

Traversable 인터페이스

(PHP 5 >= 5.0.0)

소개

클래스가 foreach 로 순회가능할 경우 그것을 감지하는 인터페이스 입니다.

단독으로 구현될수 없는 추상 인터페이스 입니다. IteratorAggregate 또는 Iterator 를 구현하세요.

Note:

이 인터페이스를 구현한 내부(내장된) 클래스는 foreach 에 사용될수 있으며, IteratorAggregate 또는 Iterator를 구현할 필요가 없습니다.

Note:

내부 엔진 인터페이스이며 PHP 스크립트로 구현될수 없습니다. 반드시 IteratorAggregate 또는 Iterator 를 사용해야 합니다. Traversable를 상속한 인터페이스를 구현할때, implements 절에서 IteratorAggregateIterator를 그 인터페이스명 앞에 지정해 주시기 바랍니다.

인터페이스 개요

Traversable {
}

이 인터페이스는 메서드가 없습니다, 이 인터페이스는 모든 순회가능한 클래스들의 기본 인터페이스로만 존재합니다.

add a note add a note

User Contributed Notes 3 notes

up
9
ajf at ajf dot me
5 months 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
55
kevinpeno at gmail dot com
4 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
mathdegiovani at gmail dot com
1 year 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:

<?php

$obj
= 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