Enum in PHP 8.1 - Wofür ist Enum und wie wird es in PHP implementiert?

Einige Tage später endet die Abstimmung über die erste Iteration der Enum-Implementierung in PHP 8.1 . Es ist bereits klar, dass es viel mehr Stimmen gibt, also lassen Sie uns kurz durchgehen und sehen, was die Autoren der Sprache für uns vorbereitet haben.







Warum brauchen wir eine Aufzählung?



Warum brauchen wir überhaupt eine Aufzählung? Im Wesentlichen dienen sie dem Zweck verbesserter Typdeklarationen. Schauen wir uns ein Beispiel ohne und mit Aufzählungen an. Nehmen wir an, wir verkaufen Autos in drei Farben: Rot, Schwarz und Weiß. Wie beschreibe ich die Farbe, welchen Typ wähle ich?







class Car {
    private string $color;

    function setColor(string $color): void {
        $this->color = $color;
    }
}
      
      





Wenn wir die Farbe des Autos als einfache Zeichenfolge beschreiben, ist zunächst beim Aufrufen von $ myCar-> setColor (..) nicht klar, welche Art von Zeichenfolge dort geschrieben werden soll. "Rot" oder "ROT" oder "# ff0000", und zweitens ist es leicht, einen Fehler zu machen, indem versehentlich etwas falsch gemacht wird (z. B. eine leere Zeichenfolge). Das gleiche passiert, wenn Sie beispielsweise Zahlen anstelle von Zeichenfolgen verwenden.







Dies führt dazu, dass viele PHP-Programmierer Konstanten erstellen und diese in einer Klasse kombinieren, um alle Optionen klar zu sehen.







class Color {
    public const RED   = "red";
    public const BLACK = "black";
    public const WHITE = "white";
}
      
      





und die Farbe einstellen, schreiben $myCar->setColor(Color::RED);









. $myCar->setColor(...), , - . - .







, . enum







Pure enum



(pure enum), enum :







enum Color {
    case Red;
    case Black;
    case White;
}
      
      





, :







class Car {
    private Color $color;

    function setColor(Color $color): void {
        $this->color = $color;
    }
}
      
      





, . setColor : $myCar->setColor(Color::White), . . .







case- (Color::Red, Color::Black, Color::White) Color ( instanseof ). .. 0,1,2 , . >, . $name:







print Color::Red->name; //   “Red”
      
      





Enum



, . enum , string. . , .







enum Color: string {
    case Red = "R";
    case Black = "B";
    case White = "W";
}
      
      





:







Color::Red->value  //  “R”
      
      





, .. case , :







Color::from("R") //   Color::Red
      
      





"case" enum . . , .







RFC.







interface Colorful {
  public function color(): string;
}

trait Rectangle {
  public function shape(): string {
    return "Rectangle";
  }
}

enum Suit implements Colorful {
  use Rectangle;

  case Hearts;
  case Diamonds;
  case Clubs;
  case Spades;

  public function color(): string {
    return match($this) {
      Suit::Hearts, Suit::Diamonds => 'Red',
      Suit::Clubs, Suit::Spaces => 'Black',
    };
  }
}
      
      





$this case, .







, match. , match .







enum PHP, , , - , enum (, Go).







— . Tagged Unions (-)



Es gibt RFCs, die die Idee von Aufzählungen weiterentwickeln, sodass Sie Werte verschiedener Typen in einer Aufzählung speichern können. Wie zum Beispiel Rust. Dann ist es möglich, beispielsweise das Ergebnis in zwei Fällen aufzulisten: Result :: Ok und Result :: Err, und diese Objekte speichern Daten: Ok speichert das Ergebnis und Err speichert einen Fehler für jeden dieser Werte Wird einen eigenen Typ haben.







Und das alles nicht in Rust oder Haskell, sondern in PHP!







Wir werden Sie in den nächsten Beiträgen des Cross Join-Telegrammkanals ausführlich darüber informieren. Vergessen Sie nicht, sich anzumelden.








All Articles