【问题标题】:Get Case from enum by string通过字符串从枚举中获取大小写
【发布时间】:2022-01-20 09:59:07
【问题描述】:

我寻找一个简单的解决方案来通过字符串获取枚举的大小写。 有 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

有没有更好的方法来达到同样的效果?

【问题讨论】:

    标签: php enums php-8.1


    【解决方案1】:

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

    Status::OK-&gt;name;

    这将返回Ok

    Status::OK-&gt;value;

    这将返回值

    从值中获取大小写。使用这个

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

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

    【讨论】:

    • 一个稍微详细一点的答案 - stackoverflow.com/a/66208862/296555
    • 我的情况不同。我会尽力说明我的意思。我不知道这个例子中的情况 Status::OK 我所拥有的是一个带有案例名称的字符串:“OK” 现在我尝试找到最简单的通用方法来获取字符串“OK”的情况
    • 看看我写的最后一行代码:Status::get("OK")。让我们建议我有一个变量$test = "OK",现在我想要从状态到那个的匹配案例。我的意思清楚吗?
    • @philsak,我编辑了我的原始回复。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-08-01
    • 2022-01-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-10
    相关资源
    最近更新 更多