Warum „Enumerations in PHP“ eine Millionen-Dollar-Frage ist
\n\nWenn du jemals nach „Enumerations in PHP“ gegoogelt hast, weißt du: Vor PHP 8.1 war dieses Thema eine echte Herausforderung. Entwickler erfanden das Rad mit Konstanten, abstrakten Klassen und cleveren Traits immer wieder neu. Stack Overflow war voll von Fragen wie „Wie emuliere ich Enum in PHP?“, und die Antworten sammelten hunderte Upvotes.
\n\nAber die Zeiten haben sich geändert. Seit PHP 8.1 sind Aufzählungen (Enum) ein nativer Bestandteil der Sprache. Und das ist nicht nur syntaktischer Zucker – es ist ein mächtiges Werkzeug für sauberen, sicheren und selbstdokumentierenden Code.
\n\nIn diesem Artikel behandeln wir alles: vom klassischen Ansatz mit Konstanten bis zu modernen Enums, mit echten Beispielen und Best Practices. Los geht's!
\n\nDas Problem: Wie PHP-Entwickler vor PHP 8.1 lebten
\n\nVor nativen Aufzählungen gab es zwei Hauptwege: Klassenkonstanten und „Workarounds“ mit abstrakten Klassen. Schauen wir uns beide an.
\n\nAnsatz #1: Klassenkonstanten (am beliebtesten)
\n\nclass OrderStatus {\n const PENDING = 'pending';\n const PROCESSING = 'processing';\n const SHIPPED = 'shipped';\n const DELIVERED = 'delivered';\n const CANCELLED = 'cancelled';\n}\n\n// Verwendung\n$status = OrderStatus::PENDING;\nif ($status === OrderStatus::PROCESSING) {\n echo 'Bestellung wird bearbeitet';\n}\n\nVorteile: Einfachheit, Verständlichkeit, Autovervollständigung in der IDE.
\nNachteile: Fehlende Typisierung. Jeder kann einen String 'invalid_status' übergeben – und PHP meckert nicht.
\n\nAnsatz #2: Abstrakte Klasse + privater Konstruktor
\n\nFortgeschrittene Entwickler gingen noch weiter:
\n\nabstract class OrderStatus {\n private function __construct() {}\n \n public static function pending(): self {\n return new class extends OrderStatus {};\n }\n public static function processing(): self {\n return new class extends OrderStatus {};\n }\n // ... restliche Status\n\nEs funktionierte, aber der Code wurde aufgebläht. Und es war immer noch eine Emulation, keine echte Sprachunterstützung.
\n\nNative Enums in PHP 8.1: Eine Revolution
\n\nMit der Veröffentlichung von PHP 8.1 wurde das Problem „Enumerations in PHP“ ein für alle Mal gelöst. Jetzt sind Aufzählungen vollwertige Typen, die:
\n\n- \n
- Strenge Typisierung unterstützen \n
- Eingebaute Methoden haben (
name,value,cases()) \n - Interfaces implementieren können \n
- Traits unterstützen \n
- Mit
matchundswitchintegriert sind \n
Grundlegende Enum-Syntax in PHP
\n\nenum OrderStatus {\n case Pending;\n case Processing;\n case Shipped;\n case Delivered;\n case Cancelled;\n}\n\n// Verwendung\n$status = OrderStatus::Pending;\necho $status->name; // 'Pending'\n\nEinfach und elegant. Aber das ist erst der Anfang.
\n\nEnum-Typen: Pure und Backed Enums
\n\nPHP unterstützt zwei Arten von Aufzählungen:
\n\n1. Pure Enum (reine Aufzählungen)
\nOhne Bindung an konkrete Werte. Ideal für Flags, Status, Typen.
\n\nenum UserRole {\n case Admin;\n case Editor;\n case Viewer;\n}\n\nfunction checkAccess(UserRole $role): bool {\n return match($role) {\n UserRole::Admin => true,\n UserRole::Editor => true,\n UserRole::Viewer => false,\n };\n}\n\n2. Backed Enum (Aufzählungen mit Werten)
\nWenn du einen Enum mit einem konkreten Wert (String oder Integer) verknüpfen musst.
\n\nenum OrderStatus: string {\n case Pending = 'pending';\n case Processing = 'processing';\n case Shipped = 'shipped';\n case Delivered = 'delivered';\n case Cancelled = 'cancelled';\n}\n\n// Wert abrufen\n$status = OrderStatus::Shipped;\necho $status->value; // 'shipped'\n\n// Aus Wert erstellen\n$