PHP 8.1 está a punto de ser lanzado, incluido el soporte para Enumeraciones. Estaba probando parte de la funcionalidad de enumeración y no pude encontrar mucha documentación al respecto. De ahí mi pregunta: ¿cómo obtengo todos los valores de una enumeración?
Después de algunas investigaciones encontré la respuesta . Puede usar el método estático: cases() .
enum Status { case PAID; case Cancelled; } Status::cases(); El método de casos devolverá una matriz con una enumeración (interfaz UnitEnum ) para cada valor.
Además de UnitEnum::cases() , puede usar ReflectionEnum con este
$reflection = new ReflectionEnum(Status::class); $reflection->getCases(); tenga en cuenta que en ambos casos no podrá obtener los métodos de enumeración. pero siempre que ReflectionEnum amplíe ReflectionClass para que pueda usar el resto de los métodos de ReflectionClass como getMethods
¿Necesita los valores y no las instancias de Enum?
Escribí un paquete de Composer para esto, othyn/php-enum-enhancements , ya que el UnitEnum::cases() no era lo que estaba buscando, ya que devuelve una matriz de instancias de MySuperCoolEnum en lugar de los valores subyacentes como su tipo crudo, que es lo que quería.
Es un rasgo que se puede agregar fácilmente a cualquier enumeración que haga lo siguiente:
Agrega un nuevo UnitEnum::valueArray(): array estático que devuelve todos los valores dentro de una Enum como una matriz de valores de Enum del mismo tipo
Agrega un nuevo método estático UnitEnum::valueList(string $separator = ', '): string que devuelve todos los valores dentro de un Enum como una cadena de lista separada por comas
En el que produce lo siguiente para Enum normales :
<?php namespace App\Enums; use Othyn\PhpEnumEnhancements\Traits\EnumEnhancements; enum TestEnum { use EnumEnhancements; case Alpha; case Bravo; case Charlie; case Delta; case Echo; } var_dump(TestEnum::valueArray()); // Results in the following being printed: // array(5) { // [0]=> // string(5) "Alpha" // [1]=> // string(5) "Bravo" // [2]=> // string(7) "Charlie" // [3]=> // string(5) "Delta" // [4]=> // string(4) "Echo" // } var_dump(TestEnum::valueList()); // Results in the following being printed: // string(34) "Alpha, Bravo, Charlie, Delta, Echo" var_dump(TestEnum::valueList(separator: ':')); // Results in the following being printed: // string(30) "Alpha:Bravo:Charlie:Delta:Echo" ... y lo siguiente para Backed Enum's, siendo el siguiente un ejemplo de string :
<?php namespace App\Enums; use Othyn\PhpEnumEnhancements\Traits\EnumEnhancements; enum TestStringBackedEnum: string { use EnumEnhancements; case Alpha = 'alpha'; case Bravo = 'bravo'; case Charlie = 'charlie'; case Delta = 'delta'; case Echo = 'echo'; } var_dump(TestStringBackedEnum::valueArray()); // Results in the following being printed: // array(5) { // [0]=> // string(5) "alpha" // [1]=> // string(5) "bravo" // [2]=> // string(7) "charlie" // [3]=> // string(5) "delta" // [4]=> // string(4) "echo" // } var_dump(TestStringBackedEnum::valueList()); // Results in the following being printed: // string(34) "alpha, bravo, charlie, delta, echo" var_dump(TestStringBackedEnum::valueList(separator: ':')); // Results in the following being printed: // string(30) "alpha:bravo:charlie:delta:echo" ... y sí, ¡también funciona en int !
Hay más ejemplos en la parte de uso del archivo README del paquete .