Menu
Coddy logo textTech

Enumy (PHP 8.1)

Część sekcji Programowanie obiektowe ścieżki PHP w Coddy. Lekcja 59 z 91.

Przed PHP 8.1 reprezentowanie ustalonego zestawu wartości, takich jak statusy lub typy, oznaczało używanie stałych klasowych lub magicznych ciągów znaków — oba podejścia były podatne na błędy. Wyliczenia (enumeracje) zapewniają właściwy sposób definiowania typu, który może przyjmować tylko określone, z góry zdefiniowane wartości.

Zdefiniuj typ wyliczeniowy za pomocą słowa kluczowego enum:

<?php
enum Status {
    case Pending;
    case Active;
    case Completed;
}

$status = Status::Active;
echo $status->name;

Wynik:

Active

Wyliczenia mogą mieć również wartości bazowe — wartości tekstowe lub całkowite przypisane do każdego przypadku. Jest to przydatne podczas przechowywania wyliczeń w bazach danych lub interfejsach API:

<?php
enum Status: string {
    case Pending = 'pending';
    case Active = 'active';
    case Completed = 'completed';
}

$status = Status::Active;
echo $status->value;

Wynik:

active

Wyliczenia z przypisaną wartością udostępniają metodę from(), która tworzy wyliczenie na podstawie jego wartości, oraz metodę tryFrom(), która zwraca null zamiast zgłaszać błąd w przypadku nieprawidłowych wartości:

<?php
$status = Status::from('active');      // Zwraca Status::Active
$invalid = Status::tryFrom('unknown'); // Zwraca null

Wyliczenia mogą również zawierać metody, co czyni je przydatnymi do hermetyzowania powiązanej logiki. Świetnie współpracują z podpowiedziami typów, dzięki czemu Twoje funkcje akceptują wyłącznie prawidłowe wartości — nie musisz już sprawdzać, czy ciąg znaków odpowiada oczekiwanym opcjom.

challenge icon

Wyzwanie

Łatwy

Stwórzmy system zarządzania zamówieniami, który wykorzystuje wyliczenia do reprezentowania statusów zamówień w bezpieczny typowo sposób. Zamiast polegać na ciągach znaków, które mogą zawierać literówki lub być nieprawidłowe, utworzysz wyliczenie z typem bazowym, które mapuje każdy status na wartość przyjazną dla bazy danych.

Uporządkujesz kod w trzech plikach:

  • OrderStatus.php: Utwórz wyliczenie OrderStatus o typie bazowym string z czterema przypadkami:
    • Pending z wartością bazową 'pending'
    • Processing z wartością bazową 'processing'
    • Shipped z wartością bazową 'shipped'
    • Delivered z wartością bazową 'delivered'
    Dodaj metodę label(), która zwraca czytelny dla człowieka opis każdego statusu:
    • Pending zwraca "Awaiting confirmation"
    • Processing zwraca "Being prepared"
    • Shipped zwraca "On the way"
    • Delivered zwraca "Order complete"
  • Order.php: Utwórz klasę Order, która korzysta z wyliczenia. Dołącz plik OrderStatus. Klasa powinna:
    • Przyjmować w konstruktorze identyfikator zamówienia (ciąg znaków) oraz OrderStatus, używając promocji właściwości konstruktora
    • Mieć metodę getInfo(), która zwraca "Order [id]: [status label]"
    • Mieć metodę getStatusValue(), która zwraca bazową wartość statusu (przydatną do przechowywania w bazie danych)
  • main.php: Dołącz plik Order. Otrzymasz dwa dane wejściowe: identyfikator zamówienia i ciąg znaków statusu (na przykład "shipped"). Użyj tryFrom(), aby bezpiecznie przekonwertować ciąg wejściowy na wyliczenie OrderStatus. Jeśli status jest prawidłowy, utwórz Order i wypisz dwa wiersze:
    • Wynik getInfo()
    • Wynik getStatusValue()
    Jeśli ciąg statusu jest nieprawidłowy, wypisz "Invalid status".

To wyzwanie pokazuje, jak wyliczenia zapewniają bezpieczeństwo typów. Klasa Order może przyjmować tylko prawidłowe statusy, a metoda tryFrom() pozwala bezpiecznie obsługiwać dane wejściowe od użytkownika bez ryzyka nieprawidłowych wartości.

Spróbuj swoich sił

<?php

require_once 'Order.php';

// Odczytaj dane wejściowe
$orderId = trim(fgets(STDIN));
$statusString = trim(fgets(STDIN));

// TODO: Użyj OrderStatus::tryFrom(), aby bezpiecznie przekonwertować ciąg statusu na enum
// tryFrom() zwraca null, jeśli wartość jest nieprawidłowa

// TODO: Jeśli status jest poprawny, utwórz Order i wypisz:
// - Wynik getInfo()
// - Wynik getStatusValue()

// TODO: Jeśli status jest nieprawidłowy, wypisz "Invalid status"

?>
quiz iconSprawdź się

Ta lekcja zawiera krótki quiz. Zacznij lekcję, żeby na niego odpowiedzieć i śledzić swoje postępy.

Wszystkie lekcje w sekcji Programowanie obiektowe

Poćwicz samodzielnie: Kompilator PHP online