列挙型では、(Pure Enum と Backed Enum ともに)
メソッドを含めることもできますし、
インターフェイスを実装することもできます。
列挙型がインターフェイスを実装する場合、
そのインターフェイスでの型チェックは、
実装した列挙型の全ての case で有効です。
<?php
interface Colorful
{
public function color(): string;
}
enum Suit implements Colorful
{
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',
};
}
// インターフェイスの一部ではないが、正しいコード
public function shape(): string
{
return "Rectangle";
}
}
function paint(Colorful $c)
{
/* ... */
}
paint(Suit::Clubs); // 動作します
print Suit::Diamonds->shape(); // "Rectangle" と表示
?>
<?php
interface Colorful
{
public function color(): string;
}
enum Suit: string implements Colorful
{
case Hearts = 'H';
case Diamonds = 'D';
case Clubs = 'C';
case Spades = 'S';
// インターフェイスの規約を満たすための実装
public function color(): string
{
return match($this) {
Suit::Hearts, Suit::Diamonds => 'Red',
Suit::Clubs, Suit::Spades => 'Black',
};
}
}
?>
<?php
interface Colorful
{
public function color(): string;
}
final class Suit implements UnitEnum, Colorful
{
public const Hearts = new self('Hearts');
public const Diamonds = new self('Diamonds');
public const Clubs = new self('Clubs');
public const Spades = new self('Spades');
private function __construct(public readonly string $name) {}
public function color(): string
{
return match($this) {
Suit::Hearts, Suit::Diamonds => 'Red',
Suit::Clubs, Suit::Spades => 'Black',
};
}
public function shape(): string
{
return "Rectangle";
}
public static function cases(): array
{
// 不正なメソッド。列挙型では、手動で cases() メソッドを定義できないからです。
// "値のリスト" のページも参照ください。
}
}
?>
メソッドには public, private, protected が指定できますが、
列挙型では実際 private と protected は同じものです。
なぜなら、継承が許されていないからです。