Seit PHP 8.1 gibt es Enums (Aufzählungen) als eigenen Sprachbestandteil. Enums definieren eine feste Menge von Werten und machen Code typsicher und lesbarer. Sie ersetzen in vielen Fällen Konstanten, die bisher für Status-Werte, Rollen oder Kategorien verwendet wurden. In diesem Tutorial lernst du, wie du Pure und Backed Enums erstellst, Methoden darin definierst und Werte mit from() und tryFrom() konvertierst.

Bevor wir Enums in der Praxis einsetzen, lohnt ein kurzer Blick auf die Grundlagen und den Unterschied zu herkömmlichen Konstanten.
Was ist ein Enum in PHP?
Ein Enum ist ein Datentyp, der eine feste Anzahl möglicher Werte (Cases) definiert. Anders als bei Konstanten kann PHP zur Laufzeit prüfen, ob ein Wert gültig ist. Enums können als Typ-Hint in Funktionsparametern und Rückgabewerten verwendet werden, was ungueltige Werte bereits vor der Ausführung ausschließt.
Pure Enums (einfache Aufzählungen)
Ein Pure Enum definiert Cases ohne zugeordnete Werte. Die Cases dienen rein als Typmarker.
<?php
enum Farbe
{
case Rot;
case Gruen;
case Blau;
}
function hintergrund(Farbe $farbe): string
{
return match($farbe) {
Farbe::Rot => '#ff0000',
Farbe::Gruen => '#00ff00',
Farbe::Blau => '#0000ff',
};
}
echo hintergrund(Farbe::Rot);
/* Ausgabe: #ff0000 */
Die Funktion hintergrund() akzeptiert ausschließlich Werte vom Typ Farbe. Ein Aufruf mit einem String oder Integer führt zu einem TypeError.
Backed Enums (wertgebundene Aufzählungen)
Backed Enums ordnen jedem Case einen String- oder Integer-Wert zu. Das ist besonders nützlich, wenn Werte in einer Datenbank gespeichert oder aus einer API empfangen werden.
String-Backed Enums
<?php
enum Status: string
{
case Entwurf = 'draft';
case Veroeffentlicht = 'published';
case Archiviert = 'archived';
}
/* Wert aus der Datenbank in Enum umwandeln */
$status = Status::from('published');
echo $status->name;
/* Ausgabe: Veroeffentlicht */
/* tryFrom gibt null zurueck statt Exception */
$unbekannt = Status::tryFrom('geloescht');
/* $unbekannt ist null */
Die Methode from() wirft eine ValueError-Exception, wenn der Wert nicht existiert. Die Methode tryFrom() gibt stattdessen null zurück und eignet sich für Fälle, in denen ungültige Werte erwartet werden können.
Integer-Backed Enums
Statt Strings lassen sich auch Integer-Werte verwenden. Alle Cases müssen denselben Typ haben.
Methoden in Enums
Enums können eigene Methoden enthalten. Das macht sie deutlich mächtiger als einfache Konstanten.
<?php
enum Prioritaet: int
{
case Niedrig = 1;
case Mittel = 2;
case Hoch = 3;
public function label(): string
{
return match($this) {
self::Niedrig => 'Niedrige Prioritaet',
self::Mittel => 'Mittlere Prioritaet',
self::Hoch => 'Hohe Prioritaet',
};
}
}
echo Prioritaet::Hoch->label();
/* Ausgabe: Hohe Prioritaet */
Enum mit Interface und Trait
Enums können Interfaces implementieren und Traits einbinden. Sie können jedoch nicht von anderen Klassen erben und keine eigenen Eigenschaften (Properties) besitzen.
Alle Cases eines Enums auflisten
Die statische Methode cases() gibt alle Cases als Array zurück. Das ist nützlich für Dropdown-Menüs oder Validierungen.
<?php
$alleCases = Status::cases();
foreach ($alleCases as $case) {
echo $case->name . ': ' . $case->value . PHP_EOL;
}
/* Ausgabe:
Entwurf: draft
Veroeffentlicht: published
Archiviert: archived */
Einschränkungen von Enums
Enums unterliegen einigen Einschränkungen, die sie von Klassen unterscheiden:
- Enums können keine Properties haben, nur Konstanten und Methoden.
- Enums können nicht mit
new instanziiert werden. - Enums können nicht erweitert (extended) werden.
- Backed Enums müssen für alle Cases einen Wert des gleichen Typs angeben (entweder
string oder int).
flowchart TD
A["Enum Status: string"] --> B["case Entwurf = 'draft'"]
A --> C["case Veroeffentlicht = 'published'"]
A --> D["case Archiviert = 'archived'"]
E["Datenbank-Wert 'published'"] --> F["Status::from('published')"]
F --> C
Fazit
PHP Enums sind eine typsichere Alternative zu Konstanten für feste Wertemengen. Pure Enums dienen als einfache Typmarker, Backed Enums speichern zusätzlich String- oder Integer-Werte. Mit eigenen Methoden, Interface-Implementierung und der Konvertierung über from() und tryFrom() bieten Enums alles, was für saubere und wartbare Code-Strukturen nötig ist. In Kombination mit dem match-Ausdruck entfalten sie ihr volles Potenzial.