Aufzählungen und Methoden
Enums (sowohl Pure Enums als auch Backed Enums) kĂśnnen Methoden enthalten
und Schnittstellen implementieren. Wenn eine Enum eine Schnittstelle
implementiert, dann akzeptiert eine TypĂźberprĂźfung fĂźr diese Schnittstelle
auch alle Fälle dieser Enum.
In diesem Beispiel haben alle vier Instanzen von Suit
zwei Methoden: color() und shape().
In Bezug auf den aufrufenden Code und die ĂberprĂźfung des Typs verhalten
sie sich genau wie jede andere Objektinstanz.
Bei einer Backed Enum erfolgt die Deklaration der Schnittstelle nach der
Deklaration des zugehĂśrigen Typs.
<?php
interface Colorful
{
public function color(): string;
}
enum Suit: string implements Colorful
{
case Hearts = 'H';
case Diamonds = 'D';
case Clubs = 'C';
case Spades = 'S';
// ErfĂźllt die Schnittstellenvereinbarung
public function color(): string
{
return match($this) {
Suit::Hearts, Suit::Diamonds => 'Red',
Suit::Clubs, Suit::Spades => 'Black',
};
}
}
Innerhalb einer Methode wird die Variable $this
definiert, die sich auf die Case-Instanz bezieht.
Die Methoden kĂśnnen beliebig komplex sein, geben aber in der Praxis
normalerweise einen statischen Wert zurĂźck oder ein match
(Ăbereinstimmung) auf $this, um fĂźr verschiedene Fälle
verschiedene Ergebnisse zu liefern.
In diesem Fall wäre es fßr die Datenmodellierung besser, auch einen
Enum-Typ SuitColor mit den Werten Red und Black zu
definieren und stattdessen diesen zurĂźckzugeben, aber das wĂźrde dieses
Beispiel verkomplizieren.
Die obige Hierarchie ähnelt logisch der folgenden Klassenstruktur (obwohl
dies nicht der tatsächlich ausgefßhrte Code ist):
<?php
interface Colorful
{
public function color(): string;
}
final class Suit implements UnitEnum, Colorful
{
public const Hearts = new self('Hearts');
public const Diamonds = new self('Diamonds');
public const Clubs = new self('Clubs');
public const Spades = new self('Spades');
private function __construct(public readonly string $name) {}
public function color(): string
{
return match($this) {
Suit::Hearts, Suit::Diamonds => 'Red',
Suit::Clubs, Suit::Spades => 'Black',
};
}
public function shape(): string
{
return "Rectangle";
}
public static function cases(): array
{
// Unzulässige Methode, weil bei einer Enum keine benutzerdefinierte case()-Methode erlaubt ist.
// Siehe auch Abschnitt "Werteliste".
}
}
Methoden kĂśnnen public, private oder protected sein, wobei private und
protected praktisch gleichwertig sind, da Vererbung nicht erlaubt ist.