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

PHP 8.1: gli Enum

Tra le novità introdotte da PHP 8.1 troviamo anche gli Enum (e i Backed Enum), una nuova modalità per gestire i tipi di dati.
PHP 8.1: gli Enum
Tra le novità introdotte da PHP 8.1 troviamo anche gli Enum (e i Backed Enum), una nuova modalità per gestire i tipi di dati.
Link copiato negli appunti

Parlando delle novità di PHP 8.1, in un precedente articolo abbiamo descritto le Fiber che portano il supporto per le funzioni asincrone. Tra le altre feature introdotte con questo aggiornamento troviamo anche gli Enum che mettono a disposizione un nuovo tipo di dati, detti anche tipi enumerati, permettendo agli utilizzatori del linguaggio di definirne sia il tipo che i valori.

Per implementare questi nuovi costrutti gli sviluppatori di PHP hanno preso come riferimento i tipi enumerati di altri linguaggio come per esempio Rust, Kotlin e Swift ma godono di una modellazione propria. Come specificato nella documentazione relativa agli Enum essi fanno riferimento alla categoria dei Fancy Object che si ritrovano anche in altre soluzioni come Python, Java, C# e Scala, in futuro però si dovrebbe introdurre il supporto anche agli ADT (Algebraic Data Types) propri di C, Typescript e F#.

Le enumerazioni sono associate a classi e oggetti e questo significa che, se non viene specificato diversamente, il loro comportamento è lo stesso di qualsiasi istanza di oggetto. Fondamentalmente gli Enum sono simili alle classi e ne condividono i medesimi namespace, le stesse interfacce e gli stessi traits.

Prevedono inoltre le medesime modalità per l'autoload e ciascun Enum definisce un nuovo tipo che ha una quantità di valori possibili fissa e limitata.

Funzionamento degli enum

L'esempio proposto di seguito, e ripreso dalla documentazione ufficiale, mostra la dichiarazione tramite il costrutto enum di un tipo enumerato che prende il nome di Suit e prevede quattro diversi valori introdotti tramite case:

enum Suit {
  case Hearts;
  case Diamonds;
  case Clubs;
  case Spades;
}

In questi casi è possibile assegnare le variabili ad uno di questi valori mentre una funzione può prevedere una verifica del tipo ed è possibile passare soltanto valori di quel determinato tipo. Quindi data una funzione di questo genere:

function pick_a_card(Suit $suit) { ... }

e dato:

$val = Suit::Diamonds;

non è possibile effettuare una chiamata che non preveda il tipo scelto, come nel caso di:

pick_a_card('Spades');

che produrrebbe un errore.

In ogni caso un'enumerazione può avere zero o più definizioni introdotte da case e da questo punto di vista non vi sono limiti. Chiaramente un Enum privo di definizioni non sarebbe utile e viene segnalato solo per il fatto di non dar luogo ad eccezioni.

Backed Enum

I Backed Enum sono un tipo particolare di Enum utile per l'introduzione di valori scalari ai vari casi proposti da case, ad esempio:

enum Suit: string {
  case Hearts = 'H';
  case Diamonds = 'D';
  case Clubs = 'C';
  case Spades = 'S';
}
print Suit::Clubs->value;
// Stampa "C"

Si possono avere Backed Enum di tipo intero o di tipo stringa mentre non è possibile disporre simultaneamente di entrambi i tipi. Il costrutto non supporta la generazione automatica di equivalenti scalari, ad esempio sequenze di interi, e non è possibile utilizzare il medesimo equivalente scalare per più case.

Ti consigliamo anche