php 如何检查未支持的枚举是否包含大小写?

pw9qyyiw  于 5个月前  发布在  PHP
关注(0)|答案(3)|浏览(50)

我有基本枚举

enum Fruit
{
  case APPLE;
  case ORANGE;
  case BANANA;
}

字符串
和一些使用该枚举类型的函数:

function eatFruit (Fruit $fruit)
{
  // do stuff
}


和未知内容的变量

$fruit = $_POST['fruit']; // user choosed "MILK"
if (?????) { // how to check if it's fruit?
  eatFruit($fruit); // this should not be executed
}


我在documentation中找不到检查枚举是否包含特定大小写的简单方法。
这是可能的支持枚举一样,

enum Fruit
{
  case APPLE = 'APPLE';
  case ORANGE = 'ORANGE';
  case BANANA = 'BANANA';
}

Fruit::from('');
Fruit::tryFrom('');


这将工作,但from不存在于非支持的枚举形式我的第一个例子。

Fatal error: Uncaught Error: Call to undefined method Fruit::from()

dnph8jn4

dnph8jn41#

你可以使用静态方法cases()来实现。这会返回枚举中所有值的数组。这些值有一个“name”属性,它是一个你可以检查的字符串表示(支持的枚举也有一个“value”属性,它包含你在枚举中定义的字符串值)。
因此,示例实现可能是这样的:

enum Fruit {
    case APPLE;
    case ORANGE;
    case BANANA;
}

// String from user input
$fruit = $_POST['fruit'];

// Find matching fruit in all enum cases
$fruits = Fruit::cases();
$matchingFruitIndex = array_search($fruit, array_column($fruits, "name"));

// If found, eat it
if ($matchingFruitIndex !== false) {
    $matchingFruit = $fruits[$matchingFruitIndex];
    eatFruit($matchingFruit);
} else {
    echo $fruit . " is not a valid Fruit";
}

function eatFruit(Fruit $fruit): void {
    if ($fruit === Fruit::APPLE) {
        echo "An apple a day keeps the doctor away";
    } elseif ($fruit === Fruit::ORANGE) {
        echo "When life gives you oranges, make orange juice";
    } elseif ($fruit === Fruit::BANANA) {
        echo "Banana for scale";
    }
}

字符串
带有示例数据的工作版本:https://3v4l.org/ObD3s
如果你想在不同的枚举中更频繁地这样做,你可以为此编写一个助手函数:

function getEnumValue($value, $enumClass) {
    $cases = $enumClass::cases();
    $index = array_search($value, array_column($cases, "name"));
    if ($index !== false) {
        return $cases[$index];
    }
    
    return null;
}

$fruit = getEnumValue($_POST['fruit'], Fruit::class);
if ($fruit !== null) {
    eatFruit($fruit);
} else {
    echo $_POST['fruit'] . " is not a valid Fruit";
}


具有相同样本数据的示例:https://3v4l.org/bL8Wa

vu8f3i0k

vu8f3i0k2#

$fruitFromPost = current(array_filter(
    Fruit::cases(),
    fn(Fruit $fruitCase) => $fruitCase->name === $_POST['fruit']
)) ?: Fruit::APPLE;

字符串
我们在每个case上使用匿名调用过滤Fruit::cases,在那里我们检查,如果case名称相同,就像POST中提供的那样。然后我们从filtered中获得current值,如果它是false(在case中没有找到名称),我们将APPLE分配为默认值(或者您可以保留false或null,如您所愿)。请注意,它是区分大小写的。

7lrncoxx

7lrncoxx3#

仅用途:
第一个月

相关问题