es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Obtener el caso de una enumeración según una cadena.

Busco una solución sencilla para obtener el caso de un enum a partir de una cadena.
Existen BackedEnums. Por ejemplo:

enum Status: string
{
    case OK = "OK";
    case FAILED = "FAILED";
    ...
}
$status = Status::tryFrom("OK"); // o from("OK");

Pero no quiero escribir la misma palabra dos veces para obtener ese resultado. ¿Existe una forma nativa de obtener el caso sin tener BackedEnums?
Quiero algo como:

enum Status
{
    case OK;
    case FAILED;
    ...
}
$status = Status::get("OK"); // devuelve Status::OK;

¿O necesito escribir mi propia funcionalidad para eso? Por ejemplo:

enum Status
{
    case OK;
    case FAILED;    
    public static function get(string $name): null|Status
    {
        $name = strtoupper(trim($name));
        if(empty($name))
            return null;

        foreach(Status::cases() as $status)
        {
            if($status->name == $name)
                return $status;
        }
        return null;
    }
}

Status::get("OK"); // -> Status::OK

¿Existe una forma mejor de lograr lo mismo?

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Según mi conocimiento e investigación, no hay una forma nativa de obtener la enumeración de un enum por medio de una cadena sin usar BackedEnums. Sin embargo, crear una función personalizada con este propósito, como la que sugeriste, es una solución válida. Otra opción podría ser usar una declaración switch de la siguiente manera:

    enum Status
    {
        case OK;
        case FAILED;
    
        public static function get(string $name): ?Status
        {
            switch(strtolower(trim($name)))
            {
                case 'ok':
                    return self::OK;
                case 'failed':
                    return self::FAILED;
                default:
                    return null;
            }
        }
    }
    
    Status::get('OK'); // devuelve Status::OK
    

    Este enfoque funciona bien para enums con pocos casos, pero puede volverse complicado para enums con muchos casos. En ese caso, crear una función personalizada podría ofrecer una mejor flexibilidad y mantenibilidad. En última instancia, la elección entre estas opciones depende de los requisitos específicos de tu caso de uso.

Comments are closed.