Enum en PHP 8.1: para que sirve y como se implementa en PHP

Unos días después, finaliza la votación sobre la primera iteración de la implementación de la enumeración en PHP 8.1 . Ya está claro que hay muchos más votos “a favor”, así que repasemos brevemente y veamos qué nos han preparado los autores del lenguaje.







¿Por qué necesitamos enumeración?



¿Por qué necesitamos enumeración? En esencia, sirven para mejorar las declaraciones de tipos. Veamos un ejemplo sin y con enumeraciones. Digamos que vendemos autos en tres colores: rojo, negro y blanco. ¿Cómo describir el color, qué tipo elegir?







class Car {
    private string $color;

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





Si describimos el color del automóvil como una cadena simple, entonces, en primer lugar, al llamar a $ myCar-> setColor (..), no está claro qué tipo de cadena escribir allí. “Rojo” o “ROJO” o “# ff0000”, y en segundo lugar, es fácil cometer un error al deslizar accidentalmente algo incorrecto (una cadena vacía, por ejemplo). Lo mismo sucederá si usa números en lugar de cadenas, por ejemplo.







Esto lleva al hecho de que muchos programadores php crean constantes y las combinan en una clase para ver claramente todas las opciones.







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





y poniendo el color, escribe $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 (-)



Hay RFC que llevan la idea de enumeraciones más allá para que pueda almacenar valores de diferentes tipos en una enumeración. Como Rust, por ejemplo. Entonces será posible hacer, digamos, enum Result con dos casos Result :: Ok y Result :: Err, y estos objetos almacenarán datos: Ok almacenará el resultado y Err almacenará un error, cada uno de estos valores Tendrá su propio tipo.







¡Y todo esto no está en Rust o Haskell, sino en PHP!







Esto te lo contamos en detalle en las próximas publicaciones del canal de telegramas Cross Join , no olvides suscribirte.








All Articles