我正在尝试从动态名称创建一个 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 那么为什么这个非常常见的情况不属于规范的一部分(只是好奇)?