Gli pseudo-tipi iterabili (iterable pseudo-type o più semplicemente iterable type) sono stati introdotti tra le feature di PHP 7.1 per determinare l'unione dei tipi primitivi degli array e dell'interfaccia Traversable che nel linguaggio viene utilizzata per rendere iterabile un determinato valore; nello specifico Traversable è un'interfaccia priva di metodi concepita con il solo scopo di fornire una base per le classi Traversable.
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 esecuzione 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 valori 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).