Using PHP Traversable interface

Code
<?php

/**
 * Your classes should be traversable
 * but you want to let the dev of the
 * interface decide to use Iterator,
 * IteratorAggregate or extending from
 * a traversable class
 */
interface Fooable extends Traversable
{
    public function 
foo();
}

/**
 * Important order:
 * Fooable needs to be set after another
 * traversable interface
 */
class Foo1 implements IteratorAggregateFooable
{
    private 
$foo;
    
    public function 
__construct(array $foo = array())
    {
        
$this->foo $foo;
    }
    
    public function 
foo()
    {
        return 
'Foo';
    }
    
    public function 
getIterator()
    {
        return new 
ArrayIterator($this->foo);
    }
}

class 
Foo2 extends ArrayIterator implements Fooable
{
    public function 
foo()
    {
        return 
'Foo';
    }
}

$foo1 = new Foo1(['Foo']);
$foo2 = new Foo2(['Foo']);

foreach (
$foo1 as $value) {
    echo 
$value PHP_EOL;
}

foreach (
$foo2 as $value) {
    echo 
$value PHP_EOL;
}
Result
Foo
Foo
Used Versions
PHP 8.2, Laminas MVC 3.2, Symfony 5.2, Laravel 8.28, PHPUnit 9.5, Doctrine ORM 2.8