Typ wyliczeniowy w PHP

Wstęp

Cześć kochani 😀 Dawno nic nie pisałem, ale mam coś na swoje usprawiedliwienie. Z drugiej strony nie ma co się tłumaczyć, bo nikt nie pytał 😆

Dzisiaj przyjrzymy się tworowi, który doszedł w PHP 8.1 (w chwili pisania postu najnowsza wersja PHP to 8.1.9 z 4 sierpnia 2022 roku), a chodzi o typ wyliczeniowy.

Zacznę dosyć ogólnie: generalnie w świecie programowania ten typ nazywanym również Enum albo Enumeration nie jest niczym nowym. Jest on dość często przydatny kiedy do czynienia mamy z konkretnymi wartościami atrybutami np. z rozmiarami ubrań np. S, M, L itd. albo z ograniczoną listą kolorów np. biały, czerwony, itd.

Kiedy i na co używać enum?

Typu wyliczeniowego używamy przeważnie w momentach, gdy dana własność może mieć określoną i ograniczoną listę wartości. To nam pomoże ograniczyć ilość wykonywanych błędów, a i też przyczyni się ku większej czytelności kodu.

Grupowanie tych wartości w jeden zwarty enum też pozwala na łatwe jej powiększenie.

Zatem czy powinniśmy ich używać? Zdecydowanie tak. Jak dla mnie fajnie jest nawet sobie różne statusty czy role wpisać w osobne enum i myk masz listę, którą możesz wszędzie użyć.

Enum w PHP

Wyliczenia to ograniczająca warstwa na wierzchu klas i stałych klas, mająca na celu zapewnienie sposobu na zdefiniowanie zamkniętego zestawu możliwych wartości dla typu.

php.net

Więcej suchej teorii tutaj: https://www.php.net/manual/en/language.enumerations.overview.php – uważam że nie ma sensu, abym tego przepisywał, gdyż to wyczerpuje temat 😉

Podstawa – przykład

Typ enum nie jest niczym trudnym, a jego używanie trochę przypomina klasę statyczną:

<?
enum Role
{
    case Admin;
    case Employee;
    case Client;
}

Oczywiście za praktykę przyjąłem nazwanie Enum w liczbie pojedynczej, gdyż będziemy wskazywać tylko na jedną rolę. W ciele wyliczenia wpisałem jakie są możliwe role. Od tak aby było jasne jakie są możliwe role.

Aby teraz jakoś tą role czemu przypisać wystarczy użyć Enum.

<?

// ...

// Przypisanie roli klienta do zmiennej
$userRole = Role::Client;
// Zmienna będzie oczywiście typu Role

// ...

A teraz to samo, ale bardziej OOP:

<?

// ...

class User
{
// ...

    public function __construct(private Role $role) {
    }
// ...
}


$user = new User(Role::Admin);

// ...

Nic nadzwyczajnego: od tak tworzymy nowego usera z rolą admin.

Wartość Enuma

Domyślnie po przypisaniu Enum do własności ten nie ma swojej wartości, a dokładnie chodzi mi o przykładowy user.role.value. Gdy spróbujemy odnieść się do wartości to dostaniemy Warring np. Warning: Undefined property: Role::$value

Aby temu zapobiec możemy określić typ prosty wartości typu wyliczalnego i przypisać pod ten typ prosty wartość dla każdego klucza enuma – brzmi skomplikowanie? No takie nie jest. Do naszego przykładu wystarczy niewiele dopisać. Załóżmy, że z jakiegoś powodu potrzebujemy, aby enum mógł zwracać typ string gdy tylko zechcemy:

<?
enum Role : string
{
    case Admin = "ADMIN";
    case Employee = "EMPLOYEE";
    case Client = "CLIENT";
}

i od razu raźniej. Doszły nam tylko 3 rzeczy:

  1. Typ po nazwie enuma czyli u nas string
  2. Znak równości z jednej z wartości
  3. Wartość dla konkretnego klucza typu string

Aby odnieść się do takiej wartości wystarczy odnieść się do własności value:

$role = Role::Admin;
$roleValue = $role->value;

Podsumowanie

Pomimo tego że to nie wszystko co można powiedzieć o enumah w PHP to jednak na dzisiaj chcę skończyć, aby wiedzę dawkować małymi porcjami. Do tego tematu jeszcze wrócę, bo ten typ jest też klasą dzięki czemu można wiele ciekawych mechanizmów w nim wdrożyć, no ale gdybym miał to wszystko za jednym razem opisać to łoho, kiedy to by powstało? 😀

Dziękuję za obejrzenie wpisu i trzymajcie się cieplusio, no bo w końcu zimno się już dzieje 🐻 Do następnego!

Subscribe
Powiadom o
guest
0 komentarzy
Inline Feedbacks
View all comments
Włączyć powiadomienia? Bardzo pragnę Dam sobie radę