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:
ActiveWyliczenia 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:
activeWyliczenia 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.
Wyzwanie
ŁatwyStwó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 wyliczenieOrderStatuso typie bazowym string z czterema przypadkami:Pendingz wartością bazową'pending'Processingz wartością bazową'processing'Shippedz wartością bazową'shipped'Deliveredz wartością bazową'delivered'
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)
- Przyjmować w konstruktorze identyfikator zamówienia (ciąg znaków) oraz
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żyjtryFrom(), aby bezpiecznie przekonwertować ciąg wejściowy na wyliczenieOrderStatus. Jeśli status jest prawidłowy, utwórzOrderi wypisz dwa wiersze:- Wynik
getInfo() - Wynik
getStatusValue()
"Invalid status".- Wynik
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"
?>Ta lekcja zawiera krótki quiz. Zacznij lekcję, żeby na niego odpowiedzieć i śledzić swoje postępy.
Wszystkie lekcje w sekcji Programowanie obiektowe
1Podstawy programowania obiektowego
Pliki zewnętrzneWprowadzenie do programowania obiektowegoKlasy a obiektySłowo kluczowe $thisMetodyWłaściwościKonstruktor (__construct)Destruktor (__destruct)Powtórka — prosty kalkulator4Dziedziczenie
Podstawy dziedziczeniaSłowo kluczowe parent::Przesłanianie metodSłowo kluczowe finalKlasy abstrakcyjnePowtórzenie – hierarchia pracowników7Enkapsulacja
Public, protected, privateModyfikatory dostępu w szczegółachGettery i setteryUkrywanie informacjiPromocja parametrów konstruktora (8.0)Podsumowanie — system ewidencji studentów10Zaawansowane koncepcje OOP
Kompozycja a dziedziczenieWstrzykiwanie zależnościKlasy anonimoweEnumy (PHP 8.1)Włókna (PHP 8.1)Dogłębne omówienie klonowania obiektówGeneratory i iteratory2Przestrzenie nazw i autoloading
Wprowadzenie do przestrzeni nazwSłowo kluczowe useStandard autoloadingu PSR-4Autoloader ComposeraPodsumowanie – uporządkowany projekt5Interfejsy i kontrakty
Wprowadzenie do interfejsówImplementowanie interfejsówImplementowanie wielu interfejsówInterfejs a klasa abstrakcyjnaPodpowiadanie typów za pomocą interfejsówPodsumowanie — kalkulator kształtów8Metody magiczne
Wprowadzenie do metod magicznych__toString i __debugInfo__get, __set, __isset, __unset__call i __callStatic__clone i klonowanie obiektów__serialize i __unserializePodsumowanie — własna kolekcja11System typów i obsługa błędów
Deklaracje typówTypy nullableTypy sumy i przecięciaKlasy wyjątkówNiestandardowa hierarchia wyjątkówTry, Catch, FinallyPodsumowanie — walidator formularzy14Projekt: Zarządzanie biblioteką
Przegląd projektuKlasy książki i użytkownika3Właściwości klas
Właściwości instancji a właściwości statyczneStałe w klasachMetody i właściwości statyczneWłaściwości prywatne i chronioneWłaściwości tylko do odczytu (PHP 8.1)Podsumowanie — menedżer kont bankowych6Polimorfizm
Ponowne omówienie nadpisywania metodPolimorfizm za pomocą interfejsówPodpowiedzi typów i typy sumyPóźne wiązanie statycznePodsumowanie — procesor płatności9Cechy
Wprowadzenie do cechKorzystanie z wielu cechRozwiązywanie konfliktów cechMetody abstrakcyjne w cechachCechy a dziedziczenie12Wzorce projektowe, część 1
Wprowadzenie do wzorców projektowychWzorzec SingletonWzorzec FactoryWzorzec ObserverWzorzec StrategyPoćwicz samodzielnie: Kompilator PHP online