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

pw9qyyiw  于 2024-01-05  发布在  PHP
关注(0)|答案(3)|浏览(192)

我有基本枚举

  1. enum Fruit
  2. {
  3. case APPLE;
  4. case ORANGE;
  5. case BANANA;
  6. }

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

  1. function eatFruit (Fruit $fruit)
  2. {
  3. // do stuff
  4. }


和未知内容的变量

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


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

  1. enum Fruit
  2. {
  3. case APPLE = 'APPLE';
  4. case ORANGE = 'ORANGE';
  5. case BANANA = 'BANANA';
  6. }
  7. Fruit::from('');
  8. Fruit::tryFrom('');


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

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

dnph8jn4

dnph8jn41#

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

  1. enum Fruit {
  2. case APPLE;
  3. case ORANGE;
  4. case BANANA;
  5. }
  6. // String from user input
  7. $fruit = $_POST['fruit'];
  8. // Find matching fruit in all enum cases
  9. $fruits = Fruit::cases();
  10. $matchingFruitIndex = array_search($fruit, array_column($fruits, "name"));
  11. // If found, eat it
  12. if ($matchingFruitIndex !== false) {
  13. $matchingFruit = $fruits[$matchingFruitIndex];
  14. eatFruit($matchingFruit);
  15. } else {
  16. echo $fruit . " is not a valid Fruit";
  17. }
  18. function eatFruit(Fruit $fruit): void {
  19. if ($fruit === Fruit::APPLE) {
  20. echo "An apple a day keeps the doctor away";
  21. } elseif ($fruit === Fruit::ORANGE) {
  22. echo "When life gives you oranges, make orange juice";
  23. } elseif ($fruit === Fruit::BANANA) {
  24. echo "Banana for scale";
  25. }
  26. }

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

  1. function getEnumValue($value, $enumClass) {
  2. $cases = $enumClass::cases();
  3. $index = array_search($value, array_column($cases, "name"));
  4. if ($index !== false) {
  5. return $cases[$index];
  6. }
  7. return null;
  8. }
  9. $fruit = getEnumValue($_POST['fruit'], Fruit::class);
  10. if ($fruit !== null) {
  11. eatFruit($fruit);
  12. } else {
  13. echo $_POST['fruit'] . " is not a valid Fruit";
  14. }


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

展开查看全部
vu8f3i0k

vu8f3i0k2#

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

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

7lrncoxx

7lrncoxx3#

仅用途:
第一个月

相关问题