PHP5 with SPL has a different approach of Iterator. While the Transversable interface do is the Iterator in PHP5, in Java Transversable (called Iterable) just return a Iterator.
When I use and why, each type of List below?
PHP Code:
class Person {

    private 
$name '';

    function 
getName() {
        return 
$this->name;
    }
}

interface 
Iterable {

    function 
getIterator();

}

class 
PersonList1 implements Iterable {

    private 
$list null;

    function 
__construct() {
        
$this->list = new ArrayIterator();
    }
    
    function 
getIterator() {
        
// return a reference, so I can't exec two iterations at same time
        
return $this->list;
    }
    
    function 
add(Person $person) {
        
$this->list->append($person);
    }
    
}

class 
PersonList2 implements Iterable {

    private 
$list null;

    function 
__construct() {
        
$this->list = new ArrayIterator();
    }
    
    function 
getIterator() {
        
// return a clone
        
return clone($this->list);
    }

    function 
add(Person $person) {
        
$this->list->append($person);
    }
}

class 
PersonList3 implements Iterable {

    private 
$list = array();

    function 
__construct() {}

    function 
getIterator() {
        
// return a new Iterator
        
return  new ArrayIterator($this->list);
    }

    function 
add(Person $person) {
        
$this->list[] = $person;
    }
}

// kind of Adapter
class PersonList4 implements Iterator {

    private 
$list null;

    function 
__construct() {
        
$this->list = new ArrayIterator();
    }

    function 
next() {
        
$this->list->next();
    }

    function 
rewind() {
        
$tthis->list->rewind();
    }

    function 
current() {
        return 
$this->list->current();
    }
    
    function 
key() {
        return 
$this->list->key();
    }

    function 
valid() {
        return 
$this->list->valid();
    }

    function 
add(Person $person) {
        
$this->list->append($person);
    }
}

// The other ArrayIterator methods are public do the user
class PersonList5 extends ArrayIterator {

    function 
__construct() {
        
parent::__construct();
    }

    function 
add(Person $person) {
        
$this->append($person);
    }