21
8

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

PHP8.1でenumが使えるようになる!

Last updated at Posted at 2021-07-12

PHP8.1からenumが使えるようになります

PHP8.1は2021年11月25日リリース予定です。
追加される新機能は以下を参考
https://stitcher.io/blog/new-in-php-81
その中で注目の一つはenumが追加されることかなと思います。

実際にどんな感じに使えるのか?

enumの宣言

まずは以下のようにenumを宣言します。

enum Status
{
    case DRAFT;
    case PUBLISHED;
    case ARCHIVED;
}

宣言したenumを利用する

以下のようにコンストラクターでenumを引数として利用します。

class BlogPost
{
    public function __construct(
        public Status $status, 
    ) {}
}

先ほど作成したBlogPostのインスタンスを作成します。
この際に、作成したenumのStatusを引数として与えます。
Status::DRAFTのように記述します。

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

enumでメソッドを定義する

enumでは、classを同じようにメソッドも定義できます。
今回はcolor()というメソッドを作成して、enumとマッチしたものを指定した文字列として返します。

enum Status
{
    case DRAFT;
    case PUBLISHED;
    case ARCHIVED;
    
    public function color(): string
    {
        return match($this) 
        {
            Status::DRAFT => 'grey',   
            Status::PUBLISHED => 'green',   
            Status::ARCHIVED => 'red',   
        };
    }
}

定義したメソッドは以下のように利用します。
この場合、'red'が返却値となります。

$status = Status::ARCHIVED;

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

interfacesの実装

enumはclassと同じようにinterfacesの実装をすることも可能です。
以下のようにHasColorというinterfacesが定義されていたとします。

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

その際には、classと同様にimplementsで実装することができます。

enum Status implements HasColor
{
    case DRAFT;
    case PUBLISHED;
    case ARCHIVED;
    
    public function color(): string { /* … */ }
}

PHP8.1ではenumの追加以外にも魅力的なアップデートが多そうです。

参考

21
8
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
21
8

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?