On Wed, Feb 8, 2023, at 5:30 PM, Sergii Shymko wrote: > Hi, > > I'd like to propose an improvement to backed enumerations introduced in > PHP 8.1. > When using enums, it's very common to get all values using the > following boilerplate: > $enumValues = array_map( > fn (\BackedEnum $case) => $case->value, > ExampleEnum::cases() > ); > > The primary use case is when an enum is used in a "set" (array of values). > For example, a user inputs a subset of available values. > The input may be optional defaulting to all values if omitted. > For example, an array option of a CLI tool: > $inputValues = $input->getOption('enum') ?: $enumValues > > The secondary use case is for informational purposes. > For example, the CLI tool may list all available values of an enum > option in --help. > The list of values can also be used to produce informative error > messages: > $output->writeln("Option is invalid, allowed values: " . implode(', ', > $enumValues)) > > The last use case is input validation. > Although tryFrom() can be used, having access to all values can come in > handy. > For instance, you could immediately get valid and invalid enum values: > $invalidValues = array_diff($inputValues, $enumValues); > The implementation would be more verbose and wasteful otherwise: > $invalidValues = array_filter($inputValues, fn ($value) => > !ExampleEnum::tryFrom($value)); > > The proposal is to add the values getter to backed enums: > interface BackedEnum extends UnitEnum > { > public static values(): array; > } > $enumValues = ExampleEnum::values(); > > Indeed, it's possible to implement this userland in a trait reused across > enums. > However, the implementation in C will be substantially more performant. > For instance, the values() method call can resolve to a constant! > > An alternative syntax is a pseudo-constant, for example, > ExampleEnum::values. > Unlike the constant, the method would be part of the interface > complementing cases(). > Method cases() itself is not a constant only because it returns > instances. > I'm fine with either syntax leaning towards the method for consistency. > > Please let me know your thoughts. > With enough support, I'd be happy to submit an RFC and implement it myself. > Some guidance on the performance optimization aspect may be necessary though. > I'm still missing the karma necessary to create RFCs in the wiki. > > Regards, > Sergii Shymko
I would be OK with this, assuming the method approach. (The class constant feels clunkier.) --Larry Garfield -- PHP Internals - PHP Runtime Development Mailing List To unsubscribe, visit: https://www.php.net/unsub.php