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 mereufalse. Compară cu cazul (Status::Platita) sau cu$status->value. - Folosești
from()pe date venite de la utilizator. Dacă valoarea nu există, primeștiValueError. Pentru date nesigure foloseștetryFrom()ș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.