> On May 21, 2024, at 6:47 PM, Bilge <bi...@scriptfusion.com> wrote: > > On 22/05/2024 00:31, Larry Garfield wrote: >> I could see an argument for auto-populating the backing value off the enum >> name if it's not specified, something like this: >> enum Options: string { >> case First; // This implicitly gets "First" >> case Second = '2nd'; >> } > This seems like a reasonable compromise. In this case, all I need to do is > change my enum to a backed enum (suffix `: string`) and I get the benefits of > implicit values. I still like the idea of the same being possible for > non-backed enums, though I imagine that is a product of my naïveté, as I do > not tend to think of things in the framing of (de)serialization. > >> I'm not sure if I'd support it myself at the moment > Noted, but I once again find myself needing to ask: why not? Were it up to > me, I'd say let's start right now! :) > > Aside, I am not at all concerned with integer-backed enums at this juncture, > and presume that could be a separate discussion/implementation anyway. > > Cheers, > Bilge > As a workaround, you can use something like the trait below.
``` trait SerializableEnum { public readonly string $name; /** @return list<self> */ abstract public static function cases(): array; public function toString(): string { return $this->name; } public static function from(string $name): self { return self::tryFrom($name) ?? throw new ValueError(sprintf( '"%s" is not a valid backing value for enum %s', $name, self::class, )); } public static function tryFrom(string $name): ?self { foreach (self::cases() as $case) { if ($case->name === $name) { return $case; } } return null; } } enum ExampleEnum { use SerializableEnum; case ONE; case TWO; case THREE; } var_dump(ExampleEnum::from('ONE')); var_dump(ExampleEnum::from('FOUR')); ``` Perhaps not as clean and easy as the functionality being built-in, but it gets the job done. :-D Aaron Piotrowski