【发布时间】:2022-06-12 15:42:58
【问题描述】:
在 PHP 8.1 中,BackedEnum 提供了一个 from 和 tryFrom 方法来从一个值中获取一个枚举。非支持的枚举如何实现同样的效果?
BackedEnum 示例:
enum MainType: string
{
case Full = 'a';
case Major = 'b';
case Minor = 'c';
}
var_dump(MainType::tryFrom('a')); // MainType::Full
var_dump(MainType::tryFrom('d')); // null
但是,这对于常规枚举不存在。
如何按名称检索“普通”枚举,例如:
enum MainType
{
case Full;
case Major;
case Minor;
}
$name = (MainType::Full)->name
var_dump(name); // (string) Full
我发现的一个选项是简单地添加一个tryFromName 函数,接受一个字符串并像这样循环所有情况:
enum MainType
{
case Full;
case Major;
case Minor;
public static function tryFromName(string $name): ?static
{
foreach (static::cases() as $case) {
if ($case->name === $name) {
return $case;
}
}
return null;
}
}
$name = (MainType::Full)->name
var_dump(name); // (string) Full
var_dump(MainType::tryFromName($name)); // MainType::Full
这是可行的,但是它使 foreach 循环遍历所有可能性只是为了创建一个枚举。
因此问题是,从名称中获取 PHP 枚举的正确方法是什么。
【问题讨论】:
-
您在寻找
var_dump(constant("MainType::$name"));,如果$name = "Full"将显示enum(MainType::Full)。 -
我刚刚尝试过,虽然它可以工作,但它需要类的全名,如“App\\Config\\MainType”,这很好,但是当设置
$name对于不存在的东西,会抛出错误,而不是我想要的null。我可以将整个调用包装在一个 try/catch 块中,但这比简单地循环一个充满值的手更好吗? -
是的,错误是设计使然。开始听起来像x/y problem。如果您不确定枚举是否存在,为什么首先使用枚举?也许你可以举一个真实的例子,为什么你需要这样的东西?
-
当然@0stone0 在我的情况下,我使用的是 Symfony 表单的 EnumType,在一种情况下,所选值可以通过可选的 get 参数设置。在我的情况下,我只是将参数转换为字符串,默认值为
'none',如果未设置(或无效),我只想要一个null