0

我正在尝试从动态名称创建一个 php 8.1 枚举。似乎不可能。所以给定一个枚举

enum Foo {
    case bar;
}

当然,以下工作:Foo::bar虽然这不是:

$name = "bar";
Foo::${$name}

这导致:访问未声明的静态属性 App\Console\Commands\Foo::$bar

我在这里尝试了各种技巧,但无济于事。似乎不可能从动态名称中获取枚举实例。我的自定义和快速解决方法如下所示,一个静态工厂:

/**
 * @throws \Exception
 */
public static function fromName(string $name) : self {

    foreach(Foo::cases() as $enum){
        if($enum->name === $name){
            return $enum;
        }
    }
    throw new \Exception("Not a valid enum name");
}

我可以把它放在一个特征中并在我所有的枚举中继承它,是的,问题解决了。

我的问题是:我在这里错过了什么吗?用原生 php 方法实例化枚举真的不可能吗?还是我想错了方向?

php8.1 之前的 class-as-enum 作曲家包曾经有那些方便的方法,请参阅https://github.com/bensampo/laravel-enum 那么为什么这个非常常见的情况不属于规范的一部分(只是好奇)?

4

1 回答 1

0

你可以做这样的事情吗?


enum Status {
  case OK;
  case DENIED;
}

$name = "OK";
$reflection = new \ReflectionEnum(Status::class);
if ( $reflection->hasConstant( $name ) ) {
  var_dump($reflection->getConstant( $name ));
}

输出:enum(Status::OK)

于 2022-02-07T12:45:10.223 回答