Это пост боли.

Я сегодня обновил проект до php 8.1 и наконец-то получил возможность воспользоваться енумами, которыетак давно нам обещали. Собственно, в основном ради них и обновлялся. Но как же я был разочарован...

Итак, что ожидалось: полноценный классы-синглтоны с предустановленными инстансами и статическим доступом к ним.

А что получили? Нет, серьезно, что это за срань? Какие-то псевдоклассы без состояния, ни полей, ни методов. Даже банальный __toString определить не могу, да он даже не предустановлен... Ну ок, статику оставили, но зачем она?

Нет, я на полном серьезе рассчитывал, что смогу делать так:

enum Country
{
    case USA = new self('840', 'US', 'USA', 'США');
    case RUS = new self('643', 'RU', 'RUS', 'Россия');

    public function __construct(
        public readonly string $num,
        public readonly string $alpha2,
        public readonly string $alpha3,
        public readonly string $name,
    ) {
    }

    public function __toString(): string
    {
        return $this->alpha3;
    }
}

Но как же я обломался...

По сути все, что я могу сделать, это:


enum Country: string
{
    case USA = 'USA';
    case RUS = 'RUS';

    public static function num(self $country): string
    {
        return match ($country) {
            self::USA => '840',
            self::RUS => '643',
        };
    }

    public static function alpha2(self $country): string
    {
        return match ($country) {
            self::USA => 'US',
            self::RUS => 'RU',
        };
    }

    public static function alpha3(self $country): string
    {
        return match ($country) {
            self::USA => 'USA',
            self::RUS => 'RUS',
        };
    }

    public static function name(self $country): string
    {
        return match ($country) {
            self::USA => 'США',
            self::RUS => 'Россия',
        };
    }
}

Прям ну очень лаконично получилось. Так потом эту статику еще и вызывать над енумами, что тоже красоты не добавляет.

Ну и на кой черт такие енумы нужны? Это такая традиция в php, сначала сделать через задницу, а потом оставить все в таком виде ради обратной совместимости?

Причем тут и придумывать ничего не надо было, все уже придумано и реализовано в других языках, надо было просто грамотно слизать. Но они не сделали даже этого, придумав свой, как всегда особый путь. Прям обидно даже.