【问题标题】:Create Enum from Name in PHP在 PHP 中从名称创建枚举
【发布时间】:2022-06-12 15:42:58
【问题描述】:

在 PHP 8.1 中,BackedEnum 提供了一个 fromtryFrom 方法来从一个值中获取一个枚举。非支持的枚举如何实现同样的效果?

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

标签: php enums


【解决方案1】:

你可以使用反射:

trait Enum {

    public static function tryFromName(string $name): ?static
    {
        $reflection = new ReflectionEnum(Foo::class);

        return $reflection->hasCase($name)
            ? $reflection->getCase($name)->getValue()
            : null;
    }

}

enum Foo {
    use Enum;

    case ONE;
    case TWO;
}

var_dump( Foo::tryFromName('TWO')   ); // enum(Foo::TWO)
var_dump( Foo::tryFromName('THREE') ); // null

也适用于支持的枚举。

【讨论】:

    【解决方案2】:

    我的两分钱:我的包裹https://github.com/henzeb/enumhancer 为您完成了这项工作,包括其他一些可能有用的东西。

    【讨论】:

      猜你喜欢
      • 2012-12-28
      • 1970-01-01
      • 2018-04-05
      • 1970-01-01
      • 2020-06-12
      • 2019-10-12
      • 1970-01-01
      • 2016-11-28
      • 1970-01-01
      相关资源
      最近更新 更多