Enum di PHP 8.1 - untuk apa enum itu dan bagaimana penerapannya di PHP

Beberapa hari kemudian, pemungutan suara pada iterasi pertama implementasi enum di PHP 8.1 berakhir . Sudah jelas bahwa ada lebih banyak suara "untuk", jadi mari kita bahas secara singkat dan lihat apa yang telah disiapkan oleh penulis bahasa untuk kita.







Mengapa kita membutuhkan enum?



Mengapa kita membutuhkan enum sama sekali? Intinya, mereka melayani tujuan deklarasi tipe yang ditingkatkan. Mari kita lihat contoh tanpa dan dengan enum. Misalkan kita menjual mobil dalam tiga warna: merah, hitam dan putih. Bagaimana cara mendeskripsikan warna, tipe mana yang harus dipilih?







class Car {
    private string $color;

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





Jika kita mendeskripsikan warna mobil sebagai string sederhana, maka, pertama, saat memanggil $ myCar-> setColor (..), tidak jelas jenis string apa yang akan ditulis di sana. "Merah" atau "MERAH" atau "# ff0000", dan kedua, mudah membuat kesalahan dengan tidak sengaja menyelipkan sesuatu yang salah (misalnya, string kosong). Hal yang sama akan terjadi jika Anda menggunakan angka, bukan string, misalnya.







Ini mengarah pada fakta bahwa banyak programmer php membuat konstanta dan menggabungkannya dalam satu kelas untuk melihat semua opsi dengan jelas.







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





dan mengatur warna, tulis $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 (-)



Ada RFC yang membawa gagasan enum lebih jauh sehingga Anda dapat menyimpan nilai dari tipe yang berbeda dalam satu enum. Seperti Rust misalnya. Kemudian dimungkinkan untuk membuat, katakanlah, enum Hasil dengan dua kasus Result :: Ok dan Result :: Err, dan objek ini akan menyimpan data: Ok akan menyimpan hasilnya, dan Err akan menyimpan kesalahan, masing-masing nilai ini Akan memiliki tipenya sendiri.







Dan semua ini bukan di Rust atau Haskell, tapi di PHP!







Kami akan memberi tahu Anda tentang hal ini secara detail di posting berikutnya di saluran telegram Cross Join , jangan lupa untuk berlangganan.








All Articles