PHP8.1の列挙型-列挙型の目的とPHPでの実装方法

数日後、PHP8.1での列挙型実装の最初の反復に対する投票が終了します。「賛成」の票がもっとたくさんあることはすでに明らかなので、簡単に見て、言語の作者が私たちのために何を準備しているかを見てみましょう。







なぜ列挙型が必要なのですか?



なぜ列挙型が必要なのですか?本質的に、それらは改善された型宣言の目的を果たします。列挙型がある場合とない場合の例を見てみましょう。赤、黒、白の3色で車を販売しているとしましょう。色をどのように説明し、どのタイプを選択しますか?







class Car {
    private string $color;

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





車の色を単純な文字列として説明すると、まず、$ myCar-> setColor(..)を呼び出すときに、そこにどのような文字列を書き込むかが明確になりません。「赤」または「赤」または「#ff0000」。次に、誤って何か間違ったもの(たとえば、空の文字列)を滑らせて、間違いを犯しやすくなります。たとえば、文字列の代わりに数字を使用する場合も同じことが起こります。







これは、多くのphpプログラマーが定数を作成し、それらを1つのクラスに組み合わせて、すべてのオプションを明確に表示するという事実につながります。







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





色を設定して、 $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 (-)



さまざまなタイプの値を1つの列挙型に格納できるように、列挙型の概念をさらに発展させたRFCがあります。たとえば、Rustのように。次に、たとえば、Result :: OkとResult :: Errの2つのケースで列挙型のResultを作成することができ、これらのオブジェクトはデータを格納します:Okは結果を格納し、Errはエラーを格納します。これらの各値独自のタイプがあります。







そして、これはすべてRustやHaskellではなく、PHPにあります!







これについては、クロスジョインテレグラムチャネルの次の投稿で詳しく説明します。サブスクライブすることを忘れないでください。








All Articles