1

I search for a simple solution to get the case of an enum by a string. There are BackedEnums. For example:

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

But I don't want to write the same word twice for getting that result. Is there a native way to get the case without having BackedEnums? I want something like:

<?php
enum Status
{
    case OK;
    case FAILED;
    ...
}
$status = Status::get("OK"); //returns Status::OK;

Or do I need to write my own funcionality for that? For example:

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

Is there a better way to achieve the same?

philsak
  • 13
  • 2

2 Answers2

2

ReflectionEnum is the answer. In the rfc for enums in php8.1 is a chapter Reflection

There you have the method getCase(string $name) and in combination with getValue() you get the enum. With that function you can get the case via a string value.

Your Example would look like this:

$status = (new ReflectionEnum("Status"))->getCase("OK")->getValue();

Best used with an ExceptionHandler since the transmitted string, if not found, could end up in a ReflectionException

oikodomo
  • 36
  • 2
1

There is an internal name getter like this.

Status::OK->name;

This will return Ok

Status::OK->value;

This will return the value

To get the case from the value. Use this

$case = Status::tryFrom('Ok')

https://www.php.net/manual/en/backedenum.tryfrom.php

joeb
  • 689
  • 7
  • 25
  • A slightly more verbose answer - https://stackoverflow.com/a/66208862/296555 – waterloomatt Dec 17 '21 at 14:30
  • my situation is different. I will try to make clear what I mean. I don't know the case in this example Status::OK What i have is a string with the name of the case: "OK" And now I try to find the simplest generic way to get the case for the string "OK" – philsak Dec 17 '21 at 15:40
  • Look at the last line of code i wrote: `Status::get("OK")`. lets suggest that i have a variabel `$test = "OK"` and now I want the matching case from status to that. Is it clear what I mean? – philsak Dec 17 '21 at 15:45
  • @philsak, I edited my original response. – joeb Dec 18 '21 at 02:08