Heim Backend-Entwicklung PHP8 Neue Funktionen von PHP8.1 erklärt Enums-Aufzählung

Neue Funktionen von PHP8.1 erklärt Enums-Aufzählung

Nov 10, 2021 pm 03:09 PM
php8

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:

1

2

3

4

5

6

enum Status

{

    case DRAFT;

    case PUBLISHED;

    case ARCHIVED;

}

Nach dem Login kopieren

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:

1

2

3

4

5

6

class BlogPost

{

    public function __construct(

        public Status $status,

    ) {}

}

Nach dem Login kopieren

In diesem Beispiel sieht das Erstellen einer Enumeration und deren Übergabe an aBlogPost so aus:

1

$post = new BlogPost(Status::DRAFT);

Nach dem Login kopieren

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:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

enum Status

{

    case DRAFT;

    case PUBLISHED;

    case ARCHIVED;

     

    public function color(): string

    {

        return match($this)

        {

            Status::DRAFT => 'grey',  

            Status::PUBLISHED => 'green',  

            Status::ARCHIVED => 'red',  

        };

    }

}

Nach dem Login kopieren

Methoden können wie folgt verwendet werden:

1

2

$status = Status::ARCHIVED;

$status->color(); // 'red'

Nach dem Login kopieren

Statische Methoden sind ebenfalls zulässig:

1

2

3

4

5

6

7

8

9

enum Status

{

    // …

     

    public static function make(): Status

    {

        // …

    }

}

Nach dem Login kopieren

Sie können self auch in einer Aufzählung verwenden:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

enum Status

{

    // …

     

    public function color(): string

    {

        return match($this)

        {

            self::DRAFT => 'grey',  

            self::PUBLISHED => 'green',  

            self::ARCHIVED => 'red',  

        };

    }

}

Nach dem Login kopieren

# Aufzählungsschnittstelle

Aufzählungen können Schnittstellen implementieren, genau wie normale Klassen:

1

2

3

4

5

6

7

8

9

10

11

12

interface HasColor

{

    public function color(): string;

}

enum Status implements HasColor

{

    case DRAFT;

    case PUBLISHED;

    case ARCHIVED;

     

    public function color(): string { /* … */ }

}

Nach dem Login kopieren

# 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.

1

2

3

4

5

6

enum Status: string

{

    case DRAFT = 'draft';

    case PUBLISHED = 'published';

    case ARCHIVED = 'archived';

}

Nach dem Login kopieren

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.

1

2

3

4

5

6

enum Status: int

{

    case DRAFT = 1;

    case PUBLISHED = 2;

    case ARCHIVED = 3;

}

Nach dem Login kopieren

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.

1

2

3

4

5

6

7

8

enum Status: string implements HasColor

{

    case DRAFT = 'draft';

    case PUBLISHED = 'published';

    case ARCHIVED = 'archived';

     

    // …

}

Nach dem Login kopieren

#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:

1

$value = Status::PUBLISHED->value; // 2

Nach dem Login kopieren

Die Enumeration kann aus dem Wert wiederhergestellt werden mit: Enum::from

1

$status = Status::from(2); // Status::PUBLISHED

Nach dem Login kopieren

Es gibt auch ein tryFrom, das null zurückgibt, wenn ein unbekannter Wert übergeben wird. Eine Ausnahme gibt es, wenn Sie from verwenden.

1

2

$status = Status::from('unknown'); // ValueError

$status = Status::tryFrom('unknown'); // null

Nach dem Login kopieren

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()

1

2

3

4

5

6

Status::cases();

/* [

    Status::DRAFT,

    Status::PUBLISHED,

    Status::ARCHIVED

] */

Nach dem Login kopieren

Beachten Sie, dass dieses Array das eigentliche Enumerationsobjekt enthält:

1

2

3

4

array_map(

    fn(Status $status) => $status->color(),

    Status::cases()

);

Nach dem Login kopieren

#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:

1

2

3

4

5

6

$statusA = Status::PENDING;

$statusB = Status::PENDING;

$statusC = Status::ARCHIVED;

$statusA === $statusB; // true

$statusA === $statusC; // false

$statusC instanceof Status; // true

Nach dem Login kopieren

#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:

1

2

3

4

$list = [

    Status::DRAFT => 'draft',

    // …

];

Nach dem Login kopieren

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!

Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn

Heiße Artikel -Tags

Notepad++7.3.1

Notepad++7.3.1

Einfach zu bedienender und kostenloser Code-Editor

SublimeText3 chinesische Version

SublimeText3 chinesische Version

Chinesische Version, sehr einfach zu bedienen

Senden Sie Studio 13.0.1

Senden Sie Studio 13.0.1

Leistungsstarke integrierte PHP-Entwicklungsumgebung

Dreamweaver CS6

Dreamweaver CS6

Visuelle Webentwicklungstools

SublimeText3 Mac-Version

SublimeText3 Mac-Version

Codebearbeitungssoftware auf Gottesniveau (SublimeText3)

So fügen Sie PHP8 eine MySQL-Erweiterung hinzu So fügen Sie PHP8 eine MySQL-Erweiterung hinzu Oct 07, 2023 pm 03:31 PM

So fügen Sie PHP8 eine MySQL-Erweiterung hinzu

Was ist der Unterschied zwischen PHP5 und PHP8? Was ist der Unterschied zwischen PHP5 und PHP8? Sep 25, 2023 pm 01:34 PM

Was ist der Unterschied zwischen PHP5 und PHP8?

Detaillierte grafische Erläuterung der Installations- und Konfigurationsmethode von Apache2.4+php8.0 Detaillierte grafische Erläuterung der Installations- und Konfigurationsmethode von Apache2.4+php8.0 Dec 06, 2022 pm 04:53 PM

Detaillierte grafische Erläuterung der Installations- und Konfigurationsmethode von Apache2.4+php8.0

So stellen Sie eine Verbindung zur Datenbank in PHP8 her So stellen Sie eine Verbindung zur Datenbank in PHP8 her Nov 16, 2023 pm 02:41 PM

So stellen Sie eine Verbindung zur Datenbank in PHP8 her

So konvertieren Sie PHP8-Datentypen So konvertieren Sie PHP8-Datentypen Nov 16, 2023 pm 02:51 PM

So konvertieren Sie PHP8-Datentypen

Welche Leistungsverbesserungen bietet PHP8? Welche Leistungsverbesserungen bietet PHP8? Dec 21, 2023 pm 02:44 PM

Welche Leistungsverbesserungen bietet PHP8?

Ein detaillierter Blick auf JIT in PHP 8 Ein detaillierter Blick auf JIT in PHP 8 Apr 25, 2022 pm 08:46 PM

Ein detaillierter Blick auf JIT in PHP 8

Welche Funktionen hat PHP8? Welche Funktionen hat PHP8? Dec 21, 2023 pm 02:54 PM

Welche Funktionen hat PHP8?

See all articles