Traversable viene impiegata per verificare se uno specifico elemento può essere utilizzato o meno all’interno di un ciclo foreach, mentre gli pseudo-tipi iterabili hanno un comportamento simile a callable e possono essere utilizzati nei parametri e nei tipi di ritorno:
function foo(iterable $iter) foreach ($iter as $val) // ...
Fino a PHP 5.6, e anche in PHP 7.x fino all’ultimo aggiornamento, era possibile eseguire un codice come il seguente:
function dump(array $iter) var_dump($iter); dump([100, 200, 300]); dump(new Collection());
Ma nel caso in cui la funzione non fosse stata in grado di accettare un valore iterabile si sarebbe verificato un errore simile a quello presente nell’output proposto di seguito:
array(3) [0]=> int(100) [1]=> int(200) [2]=> int(300) Catchable fatal error: Argument 1 passed to dump() must be of the type array, object given..
In PHP 7.1 le cose cambiano grazie ai pseudo-tipi iterabili, notate infatti come nella funzione array possa essere sostituito con iterable:
function dump(iterable $iter) var_dump($iter); dump([100, 200, 300]); dump(new Collection());
Il risultato di una nuova avviamento non presenterà più l’errore visualizzato in precedenza:
array(3) [0]=> int(100) [1]=> int(200) [2]=> int(300) object(Collection)#2 (0)
E’ da specificare che anche se PHP ammette l’utilizzo di un qualsiasi oggetto in un foreach, iterable accetta soltanto quelli che implementano Traversable, i proprietà per iterable devono quindi essere appositamente concepiti per le iterazioni; iterable può essere adottato inoltre come tipo di ritorno che indichi una funzione destinata a restituire un valore iterabile, ma se il valore di ritorno non dovesse essere un array o un’istanza di Traversable verrà generato un errore (TypeError).