ハイサイ!オースティンやいびーん。んな、がんじゅー やいびーみ?
概要
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を使っていきましょう!