【问题标题】:Generic enum type in phpphp中的通用枚举类型
【发布时间】:2022-09-23 20:00:58
【问题描述】:

如何指定要采用的参数类型任何枚举值?

function processEnum(enum $value) 这样的东西是理想的,但似乎什么都不存在?

enum Numbers: int {
  case FIRST = 1;
  case SECOND = 2;
}


enum Foo: string {
  case BAR = \'bar\';
}

function printEnum($enumValue) {
  echo $enumValue->value;
}

printEnum(Numbers::FIRST); // 1
printEnum(Foo::BAR); // \'bar\'
printEnum(\'fail\'); // I want to reject this!

此外,最好将支持的枚举与非支持的枚举或额外支持的类型分开;例如,作为字符串支持的枚举。

标签: php types enums


【解决方案1】:

所有枚举都实现the UnitEnum interface,并且支持的枚举(具有类型和->value 属性的枚举)也实现the BackedEnum interface。您可以为这些编写类型约束:

enum Numbers: int {
  case FIRST = 1;
  case SECOND = 2;
}
enum Foo: string {
  case BAR = 'bar';
}
enum Something {
   case WHATEVER;
}

function doSomething(UnitEnum $enumValue) {
  echo "blah\n";
}
function printEnum(BackedEnum $enumValue) {
  echo $enumValue->value, "\n";
}

doSomething(Numbers::FIRST); // blah
doSomething(Foo::BAR); // blah
doSomething(Something::WHATEVER); // blah
doSomething('fail'); // TypeError

printEnum(Numbers::FIRST); // 1
printEnum(Foo::BAR); // 'bar'
printEnum(Something::WHATEVER); // TypeError
printEnum('fail'); // TypeError

【讨论】:

  • 谢谢,这正是我要找的
【解决方案2】:

带接口的版本一

<?php
interface MyEnums {} 

enum Numbers : int implements MyEnums {
  case FIRST = 1;
  case SECOND = 2;
}


enum Foo : string implements MyEnums{
  case BAR = 'bar';
}

function printEnum(MyEnums $enumValue) {
  echo $enumValue->value;
}

printEnum(Numbers::FIRST); // 1
printEnum(Foo::BAR); // 'bar'
printEnum('fail'); // Fatal error: Uncaught TypeError: printEnum(): Argument #1 ($enumValue) must be of type MyEnums

版本二例外,但也将采用任何具有公共属性“价值”的类

<?php

enum Numbers : int {
  case FIRST = 1;
  case SECOND = 2;
}


enum Foo : string {
  case BAR = 'bar';
}

function printEnum($enumValue) {
  echo $enumValue->value ?? throw new Exception('Rejected');
}

printEnum(Numbers::FIRST); // 1
printEnum(Foo::BAR); // 'bar'
printEnum('fail'); // throws an exception

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-02-05
    • 2022-01-23
    • 1970-01-01
    • 1970-01-01
    • 2017-01-14
    • 2021-03-17
    • 1970-01-01
    相关资源
    最近更新 更多