Трейты

Перечисления поддерживают включение трейтов, которые ведут себя так же, как в классе. Предостережение состоит в том, что во включаемых (use) в перечисление трейтах нельзя объявлять свойства. Во включаемом в перечисление трейте разрешается объявлять только методы, статические методы и константы. Трейт со свойствами вызовет фатальную ошибку.

<?php

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

trait Rectangle
{
    public function shape(): string
    {
        return "Прямоугольник";
    }
}

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 => 'Красный',
            Suit::Clubs, Suit::Spades => 'Чёрный',
        };
    }
}

$suit = Suit::Spades;
var_dump($suit->color());
var_dump($suit->shape());