enum în PHP

Definește un tip cu un set fix de valori posibile, de exemplu statusurile unei comenzi.

Sintaxă
enum Nume: string { case A = 'a'; case B = 'b'; }

Ce face enum

Un enum (enumerare) enumeră toate valorile permise pentru ceva: zilele săptămânii, statusurile unei comenzi, rolurile utilizatorilor. O funcție care primește un parametru de tipul enum-ului nu poate primi o valoare greșită.

Un enum „cu valori” (backed enum) are după nume : string sau : int, iar fiecare caz are o valoare. Așa poți salva cazul în baza de date și îl poți reface cu from() (aruncă eroare dacă valoarea nu există) sau tryFrom() (returnează null). cases() dă lista tuturor cazurilor.

Enum-urile pot avea metode și constante, ca o clasă, și se pot folosi foarte bine cu match.

Exemple

Exemplul 1: Status de comandă cu metodă

<?php
enum Status: string
{
    case Noua = "noua";
    case Platita = "platita";
    case Livrata = "livrata";

    public function eticheta(): string
    {
        return match ($this) {
            Status::Noua => "Comandă nouă",
            Status::Platita => "Plătită, în pregătire",
            Status::Livrata => "Livrată",
        };
    }
}

$status = Status::Platita;
echo $status->name . "\n";
echo $status->value . "\n";
echo $status->eticheta();

Rezultat

Platita
platita
Plătită, în pregătire

Exemplul 2: Din baza de date înapoi în enum

<?php
enum Rol: string
{
    case Admin = "admin";
    case Editor = "editor";
}

$dinBaza = "editor";
var_dump(Rol::from($dinBaza));
var_dump(Rol::tryFrom("vizitator"));

foreach (Rol::cases() as $rol) {
    echo $rol->value . " ";
}

Rezultat

enum(Rol::Editor)
NULL
admin editor

Exemplul 3: Enum ca tip de parametru

<?php
enum Metoda
{
    case Card;
    case Ramburs;
}

function taxa(Metoda $metoda): int
{
    return $metoda === Metoda::Ramburs ? 15 : 0;
}

echo "Taxă ramburs: " . taxa(Metoda::Ramburs) . " lei\n";
var_dump(Metoda::Card instanceof Metoda);

Rezultat

Taxă ramburs: 15 lei
bool(true)

Greșeli frecvente

  • Compari un enum cu un text: $status === "platita" este mereu false. Compară cu cazul (Status::Platita) sau cu $status->value.
  • Folosești from() pe date venite de la utilizator. Dacă valoarea nu există, primești ValueError. Pentru date nesigure folosește tryFrom() și verifică null.

Comenzi înrudite

  • const: Definește o constantă: o valoare cu nume care nu se mai poate schimba. Poate fi globală sau în interiorul unei clase.
  • switch / match: Alege un bloc de cod în funcție de valoarea unei variabile. match este varianta modernă, mai scurtă.
  • class_exists / interface_exists / enum_exists: Verifică dacă o clasă (class_exists), o interfață sau un enum a fost definit.