Menu
Coddy logo textTech

Enumerazioni (PHP 8.1)

Fa parte della sezione Programmazione orientata agli oggetti del percorso PHP di Coddy. Lezione 59 di 91.

Prima di PHP 8.1, rappresentare un insieme fisso di valori come stati o tipi significava usare costanti di classe o stringhe magiche: entrambi approcci soggetti a errori. Le enumerazioni (enum) offrono un modo appropriato per definire un tipo che può contenere solo valori specifici e predefiniti.

Definisci un enum usando la parola chiave enum:

<?php
enum Status {
    case Pending;
    case Active;
    case Completed;
}

$status = Status::Active;
echo $status->name;

Output:

Active

Gli enum possono avere anche valori associati — valori di tipo stringa o intero associati a ciascun caso. Questo è utile quando si memorizzano gli enum nei database o nelle API:

<?php
enum Status: string {
    case Pending = 'pending';
    case Active = 'active';
    case Completed = 'completed';
}

$status = Status::Active;
echo $status->value;

Output:

active

Gli enum con valore di appoggio forniscono un metodo from() per creare un enum a partire dal suo valore e tryFrom(), che restituisce null invece di generare un errore per i valori non validi:

<?php
$status = Status::from('active');      // Restituisce Status::Active
$invalid = Status::tryFrom('unknown'); // Restituisce null

Gli enum possono anche contenere metodi, il che li rende efficaci per incapsulare la logica correlata. Funzionano perfettamente con i type hint, assicurando che le tue funzioni accettino solo valori validi: non dovrai più controllare se una stringa corrisponde alle opzioni previste.

challenge icon

Sfida

Facile

Costruiamo un sistema di gestione degli ordini che usa gli enum per rappresentare gli stati degli ordini in modo sicuro dal punto di vista dei tipi. Invece di affidarti a stringhe che potrebbero contenere errori di battitura o essere non valide, creerai un enum con valori associati che mappa ogni stato a un valore adatto al database.

Organizzerai il codice in tre file:

  • OrderStatus.php: crea un enum con valori associati di tipo stringa chiamato OrderStatus, con quattro casi:
    • Pending associato a 'pending'
    • Processing associato a 'processing'
    • Shipped associato a 'shipped'
    • Delivered associato a 'delivered'
    Aggiungi un metodo label() che restituisce una descrizione leggibile per ogni stato:
    • Pending restituisce "Awaiting confirmation"
    • Processing restituisce "Being prepared"
    • Shipped restituisce "On the way"
    • Delivered restituisce "Order complete"
  • Order.php: crea una classe Order che usa l'enum. Includi il file OrderStatus. La classe deve:
    • Accettare nel costruttore un ID ordine (stringa) e un OrderStatus, usando la promozione delle proprietà del costruttore
    • Avere un metodo getInfo() che restituisce "Order [id]: [status label]"
    • Avere un metodo getStatusValue() che restituisce il valore associato dello stato (utile per memorizzarlo nel database)
  • main.php: includi il file Order. Riceverai due input: un ID ordine e una stringa di stato (come "shipped"). Usa tryFrom() per convertire in sicurezza la stringa di input in un enum OrderStatus. Se lo stato è valido, crea un Order e stampa due righe:
    • Il risultato di getInfo()
    • Il risultato di getStatusValue()
    Se la stringa di stato non è valida, stampa "Invalid status".

Questa sfida dimostra come gli enum forniscano sicurezza dei tipi. La tua classe Order può accettare solo stati validi e il metodo tryFrom() ti permette di gestire in sicurezza l'input dell'utente, senza rischiare valori non validi.

Provalo tu

<?php

require_once 'Order.php';

// Leggi l'input
$orderId = trim(fgets(STDIN));
$statusString = trim(fgets(STDIN));

// TODO: Usa OrderStatus::tryFrom() per convertire in modo sicuro la stringa dello stato in un enum
// tryFrom() restituisce null se il valore non è valido

// TODO: Se lo stato è valido, crea un Order e stampa:
// - Il risultato di getInfo()
// - Il risultato di getStatusValue()

// TODO: Se lo stato non è valido, stampa "Invalid status"

?>
quiz iconMettiti alla prova

Questa lezione include un breve quiz. Inizia la lezione per rispondere e tenere traccia dei tuoi progressi.

Tutte le lezioni di Programmazione orientata agli oggetti

Esercitati da solo: Compilatore PHP online