Это пост боли.
Я сегодня обновил проект до 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, сначала сделать через задницу, а потом оставить все в таком виде ради обратной совместимости?
Причем тут и придумывать ничего не надо было, все уже придумано и реализовано в других языках, надо было просто грамотно слизать. Но они не сделали даже этого, придумав свой, как всегда особый путь. Прям обидно даже.