こんにちは。よっしーです(^^)
今日は、PHPの列挙型(Enum)についてご紹介します。
背景
PHP8.2を利用したAPIを開発しているときに列挙型(Enum)を利用したので、そのときの調査内容を備忘としてのこしました。
こちらのサイトを参考にしています。
列挙型(Enum)列挙型定数
列挙型(Enum)には、列挙型定数を含めることができます。これらの定数は public、private、または protected であることができますが、実際のところ、継承が許可されていないため、private と protected は同等です。
列挙型定数は列挙型ケースを参照できます。例えば:
enum Size
{
case Small;
case Medium;
case Large;
public const Huge = self::Large;
}
この例では、列挙型 Size
には Small
、Medium
、Large
という3つのケースと、Huge
という列挙型定数が含まれています。Huge
の値は self::Large
に設定されています。つまり、Huge
は Large
のケースを参照しています。
列挙型(Enum)Traits
列挙型(Enum)は、クラスと同様に、トレイトを活用することができます。ただし、列挙型で使用されるトレイトにはプロパティを含めることはできません。トレイトはメソッドと静的メソッドのみを含めることができます。プロパティを含むトレイトは致命的なエラーを引き起こします。
例えば:
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::Spades => 'Black',
};
}
}
この例では、列挙型 Suit
は Rectangle
というトレイトを使用しています。Rectangle
トレイトは shape()
メソッドを提供しており、Suit
列挙型はそのメソッドを継承して利用しています。このように、トレイトを使用することで、列挙型に共通のメソッドを提供することができます。
列挙型(Enum)定数
列挙ケースは列挙型自体の定数として表現されるため、ほとんどの定数式で静的な値として使用できます。例えば、プロパティのデフォルト値、静的変数のデフォルト値、パラメーターのデフォルト値、クラスおよびグローバルの定数値などです。ただし、他の列挙型ケースの値で使用することはできず、通常の定数は列挙型ケースを参照できます。
ただし、静的または定数の定義内でArrayAccessなどの暗黙のマジックメソッド呼び出しは許可されていません。そのため、結果の値が確定的であるか、メソッドの呼び出しに副作用がないことを絶対に保証できないためです。関数呼び出し、メソッド呼び出し、プロパティアクセスは、引き続き定数式では無効な操作です。
以下は具体例です:
// これは完全に合法なEnumの定義です。
enum Direction implements ArrayAccess
{
case Up;
case Down;
public function offsetGet($val) { ... }
public function offsetExists($val) { ... }
public function offsetSet($val) { throw new Exception(); }
public function offsetUnset($val) { throw new Exception(); }
}
class Foo
{
// これは許可されています。
const Bar = Direction::Down;
// これは許可されません、これは確実でない可能性があるためです。
const Bar = Direction::Up['short'];
// 致命的なエラー: 定数式で列挙型の [] を使用できません
}
// これは完全に合法で、定数式ではありません。
$x = Direction::Up['short'];
この例では、列挙型 Direction
は ArrayAccess
インターフェースを実装しています。クラス Foo
の const Bar
は Direction::Down
を参照することができますが、Direction::Up['short']
を参照しようとすると、定義が確実でないため、エラーが発生します。ただし、$x
のように定数式ではない場所で Direction::Up['short']
を使用することは許可されています。
おわりに
今日は、PHPの列挙型(Enum)についてご紹介しました。
何か質問や相談があれば、コメントをお願いします。また、エンジニア案件の相談にも随時対応していますので、お気軽にお問い合わせください。
それでは、また明日お会いしましょう(^^)
コメント