Nessun risultato. Prova con un altro termine.
Guide
Notizie
Software
Tutorial

Pseudo-tipi iterabili in PHP 7.1

Link copiato negli appunti

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).

Ti consigliamo anche