LoginSignup
1
1

PHP 8.1で入った`enum`を使ってみましょう

Last updated at Posted at 2023-06-05

ハイサイ!オースティンやいびーん。んな、がんじゅー やいびーみ?

概要

PHP 8.1でenum、つまり列挙型が追加されました。その使い方を紹介していきます!

Enum・列挙型とは何か

そもそもEnumは何かというと、不変のキーと定数の対を集めたものです。キーとその値から成るオブジェクトです。

Enumの定義自体は、制約されたクラス定義に近いです。

もともとはJava由来の概念らしいですが、以下のような使い方をします。

enum Level {
  LOW,
  MEDIUM,
  HIGH
}

Level myVar = Level.MEDIUM;

筆者はTypeScriptのenumの愛好家です。

Enumはなぜ大切か

Enumは、特定の値しか受け付けられない時に使うと、現実的な制約を表現しやすくなります。

例えば、以下の例でいくつかの権限を文字列で表現してみましょう。

const roles = ['ADMIN', 'SUBSCRIBER', 'EDITOR'];

if (user.role === 'ADMIN') { ... }

if (user.role === 'EDITR' { ... }

上記の例のように決まった権限があるのですが、毎回文字列を書いていると、必ず誤字が入りますし、この三つしか権限がないことも明確ではありません。

同じ例を列挙型で書いてみると以下のようにすっきりします。

enum Roles {
  Admin, // 0
  Editor, // 1
  Subscriber // 2
}

if (user.role === Roles.Admin) { ... }

if (user.role === Roles.Editor) { ... }

// switch構文だとさらによし
switch (user.role) {
 case Roles.Admin:
  ...
 case Roles.Editor:
  ...
}

上記のように、Enumは開発者を助けるためのツールです。Enumを使うと誤字、例外値などが入りにくくなるので助かります。

簡単な例

PHPにおけるenumはJavaとほぼ同じようです。ただ、switch構文のようにcaseを追加する必要があります。

enum Roles {
	case Admin;
	case Subscriber;
	case Editor;
}

先ほど、列挙型はキーと値が対になっていると説明しましたが、上記の例だとキーが文字列型で、値がオブジェクトです。

echo Roles::admin->name; // 'Admin'

echo Roles::admin->value; // ERROR

デフォルトの値はJavaScriptのSymbolに何となく似ています。

Enumの値を指定する方法

上記の例だとデフォルトでEnumの値の型がオブジェクト型になりますが、必ずしもこれがいいとは限りません。

SQLデータベースのEnum型に対してPHP側でもその制約を表現したい場合は、SQLの制約に合わせて同じようなEnumを用意したいはずです。

こういう時は、Enumの型を指定しましょう

enum Roles: int {
	case Admin = 1;
	case Subscriber = 2;
	case Editor = 3;
}

echo Roles::Admin->name; // 'Admin'

echo Roles::Subscriber->value; // 2

上記のように:コロンを使って値の型を指定することができます。そうするとvalueが指定したものになります。

ちなみに、stringなどでも同様に定義できます。

enum Roles: string {
	case Admin = 'A';
	case Subscriber = 'S';
	case Editor = 'E';
}

echo Roles::Subscriber->value; // S

まとめ

列挙型とPHPでの使い方を説明してきましたがいかがでしょうか?

PHP 8.1以上でないと使えないので、まだまだ使える環境は少ないのではないかと思います。

Enumに慣れていない読者、これが何なのかさっぱりわからん、という気持ちなら、一年前の筆者と一緒です。

Enumの概念に慣れるまで時間がかかりますが、使うべき場面というのがわかってきます。そして、使うべき場面で使うと、コードが一段と綺麗になります

また、Enumを正しく使いこなしている人のコードからは、只者でない趣が感じ取れます。コードの可読性が高まりますし、コードの品質も上がります。

ぜひPHPでEnumを使っていきましょう!

1
1
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
1
1