1

我寻找一个简单的解决方案来通过字符串获取枚举的情况。有 BackedEnums。例如:

<?php
enum Status: string
{
    case OK = "OK";
    case FAILED = "FAILED";
    ...
}
$status = Status::tryFrom("OK"); // or from("OK");

但我不想为了得到这个结果而写两次同一个词。在没有 BackedEnums 的情况下,是否有一种本地方法来获取案例?我想要类似的东西:

<?php
enum Status
{
    case OK;
    case FAILED;
    ...
}
$status = Status::get("OK"); //returns Status::OK;

还是我需要为此编写自己的功能?例如:

enum Status
{
    case OK;
    case FAILED;    
    public static function get(string $name): null|Status
    {
        $name = strtoupper(trim($name));
        if(empty($name))
            return null;

        foreach(Status::cases() as $status)
        {
            if($status->name == $name)
                return $status;
        }
        return null;
    }
}

Status::get("OK"); // -> Status::OK

有没有更好的方法来实现同样的目标?

4

2 回答 2

1

有一个像这样的内部名称获取器。

Status::OK->name;

这将返回Ok

Status::OK->value;

这将返回值

从值中获取案例。用这个

$case = Status::tryFrom('Ok')

https://www.php.net/manual/en/backedenum.tryfrom.php

于 2021-12-17T14:27:20.300 回答
1

ReflectionEnum是答案。在 rfc for enums in php8.1 中有一章Reflection

那里你有方法getCase(string $name),并结合getValue()你得到枚举。使用该函数,您可以通过字符串值获取案例。

您的示例如下所示:

$status = (new ReflectionEnum("Status"))->getCase("OK")->getValue();

最好与 ExceptionHandler 一起使用,因为如果未找到传输的字符串,可能会以ReflectionException

于 2022-01-03T15:43:14.663 回答