Salta al contenuto principale
PHP

PHP Enums: Type-Safe Constants per il Tuo Codice

Scopri come usare gli Enums di PHP 8.1 per rendere il tuo codice più sicuro e espressivo.

Giovanni D'Ippolito
3 min

Autore

Giovanni D'Ippolito

Pubblicato

17 November 2025

Tempo di lettura

3 minuti

Tags

#PHP 8.1 #Enums #Type Safety #Best Practices

Cosa Sono gli Enums?

Gli Enums (enumerazioni) permettono di definire un insieme limitato di valori possibili per una variabile, rendendo il codice più type-safe.

Enums Base

Ecco come definire un enum semplice:

<?php
enum Status
{
    case Pending;
    case Approved;
    case Rejected;
}

// Utilizzo
class Order
{
    public function __construct(
        public Status $status = Status::Pending
    ) {}
}

$order = new Order(Status::Approved);

// Type-safe - questo genera errore
// $order = new Order('Approved'); // ❌ Errore!
?>
A differenza delle costanti tradizionali, gli enums sono verificati a compile-time, prevenendo errori.

Backed Enums

Gli enums possono avere valori sottostanti (string o int):

<?php
enum OrderStatus: string
{
    case Pending = 'pending';
    case Processing = 'processing';
    case Shipped = 'shipped';
    case Delivered = 'delivered';
    case Cancelled = 'cancelled';
}

// Conversione da valore
$status = OrderStatus::from('pending'); // Pending
$status = OrderStatus::tryFrom('invalid'); // null (non genera errore)

// Ottieni il valore
echo OrderStatus::Pending->value; // 'pending'

// Uso nel database
class Order extends Model
{
    protected $casts = [
        'status' => OrderStatus::class,
    ];
}

// Salva nel database come stringa, recupera come Enum
$order = new Order();
$order->status = OrderStatus::Pending;
$order->save();

// Recupera
$order = Order::find(1);
echo $order->status->value; // 'pending'
?>

Metodi negli Enums

Puoi aggiungere metodi agli enums:

<?php
enum PaymentStatus: string
{
    case Pending = 'pending';
    case Paid = 'paid';
    case Failed = 'failed';
    case Refunded = 'refunded';

    public function color(): string
    {
        return match($this) {
            self::Pending => 'yellow',
            self::Paid => 'green',
            self::Failed => 'red',
            self::Refunded => 'blue',
        };
    }

    public function label(): string
    {
        return match($this) {
            self::Pending => 'In Attesa',
            self::Paid => 'Pagato',
            self::Failed => 'Fallito',
            self::Refunded => 'Rimborsato',
        };
    }

    public function canRefund(): bool
    {
        return $this === self::Paid;
    }
}

// Utilizzo
$status = PaymentStatus::Paid;
echo $status->color(); // 'green'
echo $status->label(); // 'Pagato'

if ($status->canRefund()) {
    // Processa rimborso
}
?>

Enums con Interfacce e Trait

Gli enums possono implementare interfacce:

<?php
interface HasLabel
{
    public function label(): string;
}

interface HasColor
{
    public function color(): string;
}

enum UserRole: string implements HasLabel, HasColor
{
    case Admin = 'admin';
    case Editor = 'editor';
    case User = 'user';

    public function label(): string
    {
        return match($this) {
            self::Admin => 'Amministratore',
            self::Editor => 'Editore',
            self::User => 'Utente',
        };
    }

    public function color(): string
    {
        return match($this) {
            self::Admin => 'red',
            self::Editor => 'blue',
            self::User => 'gray',
        };
    }

    public function permissions(): array
    {
        return match($this) {
            self::Admin => ['*'],
            self::Editor => ['create', 'update', 'read'],
            self::User => ['read'],
        };
    }

    public function can(string $permission): bool
    {
        $permissions = $this->permissions();
        return in_array('*', $permissions) || in_array($permission, $permissions);
    }
}

// Utilizzo
$role = UserRole::Editor;

if ($role->can('update')) {
    // Permesso concesso
}
?>
Gli enums con metodi sono perfetti per incapsulare logica relativa a stati o tipi specifici!

Listing di Tutti i Cases

Ottieni tutti i valori di un enum:

<?php
enum Priority: int
{
    case Low = 1;
    case Medium = 2;
    case High = 3;
    case Critical = 4;
}

// Ottieni tutti i cases
$allPriorities = Priority::cases();

// Usa in un select
<select name="priority">
    @foreach(Priority::cases() as $priority)
        <option value="{{ $priority->value }}">
            {{ $priority->name }}
        </option>
    @endforeach
</select>
?>

Condividi questo articolo

Articoli Correlati

PHP

Guida Completa alle Funzioni Arrow in PHP 8

Scopri come le arrow functions di PHP 8 possono semplificare il tuo codice e renderlo più leggibile.

01 Nov 2025 2 min
Leggi di più →
PHP

PHP 8.2: Readonly Classes e Type System Migliorato

Esplora le nuove funzionalità di PHP 8.2 che rendono il codice più sicuro e manutenibile.

09 Nov 2025 2 min
Leggi di più →
PHP

PHP Attributes: Metaprogramming Moderno

Scopri come usare gli Attributes di PHP 8 per aggiungere metadata al tuo codice.

25 Nov 2025 1 min
Leggi di più →

Rimani Aggiornato

Iscriviti alla nostra newsletter per ricevere gli ultimi articoli e novità direttamente nella tua casella di posta.