Dieser Artikel ist übersetzt, Originaladresse: https://stitcher.io/blog/php-enums
PHP 8.1: Aufzählungen
Sie sind endlich da – integrierte Unterstützung für Aufzählungen wird in PHP hinzugefügt 8.1-Unterstützung! Manche denken vielleicht, sie hätten das schon vor langer Zeit tun sollen, aber Sie haben meine Beschwerde nicht gehört. Ich bin froh, dass sie es getan haben! Dieser Artikel ist einem detaillierten Einblick in die neu hinzugefügten Funktionen gewidmet.
Wie in meinen Beiträgen zu PHP-Funktionen üblich, beginnen wir mit einem allgemeinen Überblick darüber, wie Aufzählungen aussehen:
enum Status { case DRAFT; case PUBLISHED; case ARCHIVED; }
Das Gute an Aufzählungen ist, dass sie eine Reihe konstanter Werte darstellen, aber am wichtigsten ist, dass diese Werte dies können be Geben Sie es so ein:
class BlogPost { public function __construct( public Status $status, ) {} }
In diesem Beispiel sieht das Erstellen einer Enumeration und deren Übergabe an aBlogPost so aus:
$post = new BlogPost(Status::DRAFT);
Das sind die Grundlagen, und wie Sie sehen, sind sie überhaupt nicht kompliziert. Obwohl es noch viele Randnotizen zu machen gibt, werfen wir einen genaueren Blick auf Aufzählungen!
#Aufzählungsmethoden
Aufzählungen können Methoden definieren, genau wie Klassen. Dies ist eine sehr leistungsstarke Funktion, insbesondere in Kombination mit dem Match-Operator:
enum Status { case DRAFT; case PUBLISHED; case ARCHIVED; public function color(): string { return match($this) { Status::DRAFT => 'grey', Status::PUBLISHED => 'green', Status::ARCHIVED => 'red', }; } }
Methoden können wie folgt verwendet werden:
$status = Status::ARCHIVED; $status->color(); // 'red'
Statische Methoden sind ebenfalls zulässig:
enum Status { // … public static function make(): Status { // … } }
Sie können self auch in einer Aufzählung verwenden:
enum Status { // … public function color(): string { return match($this) { self::DRAFT => 'grey', self::PUBLISHED => 'green', self::ARCHIVED => 'red', }; } }
# Aufzählungsschnittstelle
Aufzählungen können Schnittstellen implementieren, genau wie normale Klassen:
interface HasColor { public function color(): string; } enum Status implements HasColor { case DRAFT; case PUBLISHED; case ARCHIVED; public function color(): string { /* … */ } }
# Aufzählungswerte – auch bekannt als „unterstützte Aufzählungen“
Aufzählungswerte werden intern durch Objekte dargestellt, Sie können jedoch Werte zuweisen bei Bedarf; dies ist nützlich für z.B. Serialisieren Sie sie in die Datenbank.
enum Status: string { case DRAFT = 'draft'; case PUBLISHED = 'published'; case ARCHIVED = 'archived'; }
Achten Sie auf die Typdeklaration in der Aufzählungsdefinition. Es zeigt an, dass alle Aufzählungswerte zum angegebenen Typ gehören. Sie können es auch zu einem int machen. Beachten Sie, dass nur int und string als Aufzählungswerte zulässig sind.
enum Status: int { case DRAFT = 1; case PUBLISHED = 2; case ARCHIVED = 3; }
Der Fachbegriff für Typ-Enums wird „Backed Enums“ genannt, weil sie durch einfachere Werte „unterstützt“ werden. Wenn Sie sich entscheiden, einen Aufzählungswert zuzuweisen, sollten alle Fälle einen Wert haben. Man kann sie nicht kombinieren. Aufzählungen ohne „Backup“ werden „reine Aufzählungen“ genannt.
#Unterstützte Aufzählungen mit Schnittstellen
Wenn Sie eine unterstützte Aufzählung mit einer Schnittstelle verwenden, muss der Aufzählungstyp direkt nach dem Aufzählungsnamen und vor dem Schlüsselwort „implements“ stehen.
enum Status: string implements HasColor { case DRAFT = 'draft'; case PUBLISHED = 'published'; case ARCHIVED = 'archived'; // … }
#Serialisierung unterstützte Aufzählungen
Wenn Sie Aufzählungsfällen Werte zuweisen möchten, benötigen Sie möglicherweise eine Möglichkeit, diese zu serialisieren und zu deserialisieren. Wenn Sie sie serialisieren, benötigen Sie eine Möglichkeit, auf die Enum-Werte zuzugreifen. Dies erfolgt über eine schreibgeschützte öffentliche Eigenschaft:
$value = Status::PUBLISHED->value; // 2
Die Enumeration kann aus dem Wert wiederhergestellt werden mit: Enum::from
$status = Status::from(2); // Status::PUBLISHED
Es gibt auch ein tryFrom, das null zurückgibt, wenn ein unbekannter Wert übergeben wird. Eine Ausnahme gibt es, wenn Sie from verwenden.
$status = Status::from('unknown'); // ValueError $status = Status::tryFrom('unknown'); // null
Bitte beachten Sie, dass Sie die integrierten Serialisierungs- und Deserialisierungsfunktionen auch für Aufzählungen verwenden können. Darüber hinaus können Sie json_encode mit einer unterstützten Aufzählung verwenden und das Ergebnis ist ein Aufzählungswert. Dieses Verhalten kann durch die Implementierung von JsonSerializable überschrieben werden.
#Enumerationswerte auflisten
Sie können eine Liste aller verfügbaren Fälle in einer Enumeration mit der statischen Methode erhalten: Enum::cases()
Status::cases(); /* [ Status::DRAFT, Status::PUBLISHED, Status::ARCHIVED ] */
Beachten Sie, dass dieses Array das eigentliche Enumerationsobjekt enthält:
array_map( fn(Status $status) => $status->color(), Status::cases() );
#Aufzählungen sind Objekte
Ich habe bereits erwähnt, dass Aufzählungswerte als Objekte dargestellt werden, tatsächlich handelt es sich um Singleton-Objekte. Das bedeutet, dass Sie sie wie folgt vergleichen können:
$statusA = Status::PENDING; $statusB = Status::PENDING; $statusC = Status::ARCHIVED; $statusA === $statusB; // true $statusA === $statusC; // false $statusC instanceof Status; // true
#Enums als Array-Schlüssel
Da Enum-Werte tatsächlich Objekte sind, können Sie sie derzeit nicht als Array-Schlüssel verwenden. Folgendes führt zu einem Fehler:
$list = [ Status::DRAFT => 'draft', // … ];
Es gibt einen RFC zur Änderung dieses Verhaltens, über den jedoch noch nicht abgestimmt wurde.
Das bedeutet, dass Sie Aufzählungen nur als Schlüssel in SplObjectStorage und WeakMaps verwenden können.
#Traits
Aufzählungen können Merkmale wie Klassen verwenden, jedoch mit mehr Einschränkungen. Das Überschreiben integrierter Aufzählungsmethoden ist nicht zulässig und sie dürfen keine Klassenattribute enthalten – ihre Verwendung in Aufzählungen ist verboten.
#Reflection und Eigenschaften
Wie erwartet wurden einige Reflection-Klassen zur Verarbeitung von Aufzählungen hinzugefügt: ReflectionEnum, ReflectionEnumUnitCase und ReflectionEnumBackedCase. Es gibt auch eine neue Funktion enum_exists, die genau das tut, was ihr Name vermuten lässt.
Genau wie normale Klassen und Attribute können Aufzählungen und ihre Fälle mithilfe von Attributen annotiert werden. Beachten Sie, dass der TARGET_CLASS-Filter auch Aufzählungen enthält.
Eine letzte Sache: Die Aufzählung hat auch eine schreibgeschützte Eigenschaft. Der RFC erwähnt, dass es sich dabei um ein Implementierungsdetail handelt und nur zu Debugzwecken verwendet werden sollte. Aber es ist trotzdem erwähnenswert. $enum->name
Das obige ist der detaillierte Inhalt vonNeue Funktionen von PHP8.1 erklärt Enums-Aufzählung. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!