Enums în PHP 8

Adrian Voicu
2 min readJan 17, 2024

Enumerările sau “Enums” ne permit să definim un nou tip de date cu un număr finit de valori posibile (de exemplu valorile boolean sunt de tip enum pentru că pot fi doar true sau false). Principala sursa pentru acest articol este un material video apărut pe canalul Program with Gio (https://www.youtube.com/@ProgramWithGio). Vă recomand să vedeți multe videouri acolo, materialele fiind de calitate.

Enum e un obiect de tip singleton. Enum nu poate fi instanțiat.

<?php
enum InvoiceStatus
{
case Pending;
case Paid;
case Void;
case Failed;
}

Pure enums vs backed enums

Un backed enum are valori pentru obiectele respective. Pentru a crea un backed enum, e necesar să facem type hinting la definiția enumului (string sau integer)

<?php

enum InvoiceStatus: int
{
case Pending = 0;
case Paid = 1;
case Void = 2;
case Failed = 3;
}

Nu există combinații care să permită jocul cu tipul de enum; nu există enum pe jumătate pur și pe jumătate backed (cu case-uri pure și cu case-uri backed) sau enumuri care sa returneze și string și int.

print InvoiceStatus::Pending->value;
print InvoiceStatus::Pending->name;

Putem accesa toate case-urile folosindu-ne de metoda statica cases:

print InvoiceStatus::cases();

Accesarea valorilor unui backed enum

Se pot accesa valori în ambele sensuri. În exemplul nostru, putem returna numele itemului (Failed) folosindu-ne de valoare (3). Facem asta folosindu-ne de metodele statice “from” (returnează excepție dacă nu există valoarea) și “tryFrom” (returnează null dacă nu există valoarea).

print InvoiceStatus::tryFrom(3)->name;

Pentru situația în care dorim să returnăm altceva decât numele sau valoarea enumului, ne putem folosi de o metodă toString() adăugând-o clasei:

public function toString(): string
{
return match($this) {
self::Pending => 'In asteptare',
self::Paid => 'Platita',
self::Void => 'Invalidata',
self:Failed => 'Esuata',
default => 'In asteptare'
}
}
print InvoiceStatus::tryFrom(3)->toString();

Inheritance, proprietăți?

Enums poate implementa interfețe, folosi trait-uri, dar nu poate extinde clase. Enums nu acceptă proprietăți, deci acestea nu ar trebui sa existe în trait-uri.

--

--