在PHP中通过存储在字符串中的名称获取枚举值

p1tboqfb  于 2022-12-02  发布在  PHP
关注(0)|答案(5)|浏览(157)

我想在PHP中通过名字得到枚举的值。我的枚举是这样的:

enum Status : int
{
    case ACTIVE = 1;
    case REVIEWED = 2;
    // ...
}

Status::from(2)可用于获取"REVIEWED",但如何从存储在字符串中的名称解析值?

dfty9e19

dfty9e191#

您可以对Backed case使用反射:

$reflection = new ReflectionEnumBackedCase(Status::class, 'REVIEWED');
$reflection->getBackingValue(); // 2
$reflection->getValue() // Status::REVIEWED if you need case object

或枚举反思:

$reflection = new ReflectionEnum(Status::class);
$reflection->getCase('REVIEWED')->getValue()->value // 2

另请参阅反射枚举单元格

7nbnzgx9

7nbnzgx92#

好吧,PHP中似乎没有任何内置的解决方案。我用一个自定义函数解决了这个问题:

enum Status : int
{
    case ACTIVE = 1;
    case REVIEWED = 2;
    // ...

    public static function fromName(string $name): string
    {
        foreach (self::cases() as $status) {
            if( $name === $status->name ){
                return $status->value;
            }
        }
        throw new \ValueError("$name is not a valid backing value for enum " . self::class );
    }

}

然后,我只需使用Status::fromName('ACTIVE')并得到1
如果要模拟fromtryFrom枚举函数,还可以添加:

public static function tryFromName(string $name): string|null
{
    try {
        return self::fromName($name);
    } catch (\ValueError $error) {
        return null;
    }
}
wydwbb8l

wydwbb8l3#

要从名称获取值:

enum Status : int
{
   case ACTIVE = 1;
   case REVIEWED = 2;
   // ...
}

print(Status::REVIEWED->value);

Enum documentation

gojuced7

gojuced74#

我也使用了一个自定义方法,但是我返回了一个枚举。from 方法返回的是一个枚举,而不是一个值。我认为 fromName 方法也应该返回一个枚举。这样你就可以访问枚举的所有方法。你不需要使用另一个方法- from

public static function fromName(string $name): self
{
    foreach (self::cases() as $status) {
        if( $name === $status->name ){
            return $status;
        }
    }
    throw new \ValueError("$name is not a valid backing value for enum " . self::class );
}

public static function tryFromName(string $name): self|null
{
    try {
        return self::fromName($name);
    } catch (\ValueError $error) {
        return null;
    }
}
7z5jn7bk

7z5jn7bk5#

constant()函数可以使用字符串变量返回常量的值。
这也适用于PHP手册的基本枚举部分中提到的枚举类常量。

$name = 'REVIEWED';
$status = constant("Status::{$name}");

相关问题