我正在尝试从动态名称创建 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 https://github.com/bensampo/laravel-enum那么为什么这种非常常见的情况没有成为规范的一部分(只是好奇)?
最简单的方法是使用持续的() https://php.net/manual/en/function.constant.php功能:
<?php namespace App\Enums;
enum FooEnum: int
{
case FOO = 123;
case BAR = 456;
public static function fromName(string $name){
return constant("self::$name");
}
}
Usage:
$name = "FOO";
dump(App\Enums\FooEnum::fromName($name));
/*
return
App\Enums\FooEnum {
+name: "FOO"
+value: 123
}
*/
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)