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.
<?php
interface Colorful
{
public function color(): string;
}
enum Suit implements Colorful
{
case Hearts;
case Diamonds;
case Clubs;
case Spades;
// Erfüllt die Schnittstellenvereinbarung
public function color(): string
{
return match($this) {
Suit::Hearts, Suit::Diamonds => 'Red',
Suit::Clubs, Suit::Spades => 'Black',
};
}
// Nicht Teil der Schnittstelle; das ist OK
public function shape(): string
{
return "Rectangle";
}
}
function paint(Colorful $c) { ... }
paint(Suit::Clubs); // funktioniert
print Suit::Diamonds->shape(); // gibt "Rectangle" aus
?>
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.
Deutsche Übersetzung
Sie haben gebeten, diese Seite auf Deutsch zu besuchen. Momentan ist nur die Oberfläche übersetzt, aber noch nicht der gesamte Inhalt.Wenn Sie mir bei Übersetzungen helfen wollen, ist Ihr Beitrag willkommen. Alles, was Sie tun müssen, ist, sich auf der Website zu registrieren und mir eine Nachricht zu schicken, in der Sie gebeten werden, Sie der Gruppe der Übersetzer hinzuzufügen, die Ihnen die Möglichkeit gibt, die gewünschten Seiten zu übersetzen. Ein Link am Ende jeder übersetzten Seite zeigt an, dass Sie der Übersetzer sind und einen Link zu Ihrem Profil haben.
Vielen Dank im Voraus.
Dokument erstellt 30/01/2003, zuletzt geändert 26/10/2018
Quelle des gedruckten Dokuments:https://www.gaudry.be/de/php-rf-language.enumerations.methods.html
Die Infobro ist eine persönliche Seite, deren Inhalt in meiner alleinigen Verantwortung liegt. Der Text ist unter der CreativeCommons-Lizenz (BY-NC-SA) verfügbar. Weitere Informationen auf die Nutzungsbedingungen und dem Autor.
Referenzen
Diese Verweise und Links verweisen auf Dokumente, die während des Schreibens dieser Seite konsultiert wurden, oder die zusätzliche Informationen liefern können, aber die Autoren dieser Quellen können nicht für den Inhalt dieser Seite verantwortlich gemacht werden.
Der Autor Diese Website ist allein dafür verantwortlich, wie die verschiedenen Konzepte und Freiheiten, die mit den Nachschlagewerken gemacht werden, hier dargestellt werden. Denken Sie daran, dass Sie mehrere Quellinformationen austauschen müssen, um das Risiko von Fehlern zu reduzieren.