You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PHP中如何指定函数参数接受任意枚举类型值?

在PHP中限制函数参数为枚举类型的方案

1. 接受任意枚举值

PHP没有直接的enum类型提示语法,但所有枚举都实现了内置的UnitEnum接口,直接用这个接口作为参数类型,就能强制接受任意枚举实例,自动拒绝非枚举输入:

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

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

// 非回退枚举示例
enum Status {
    case ACTIVE;
    case INACTIVE;
}

function printEnum(UnitEnum $enumValue) {
    // 回退枚举有value属性,非回退枚举可输出name
    if ($enumValue instanceof BackedEnum) {
        echo $enumValue->value;
    } else {
        echo $enumValue->name;
    }
}

printEnum(Numbers::FIRST); // 输出 1
printEnum(Foo::BAR);       // 输出 bar
printEnum(Status::ACTIVE); // 输出 ACTIVE
// printEnum('fail'); // 此处直接抛出 TypeError,符合拒绝非法输入的需求

2. 区分回退枚举与非回退枚举

  • 仅接受回退枚举:用BackedEnum作为参数类型,所有带回退类型的枚举都实现了这个接口:
function processBackedEnum(BackedEnum $enumValue) {
    echo "回退值类型:" . gettype($enumValue->value) . ",值:" . $enumValue->value;
}

processBackedEnum(Numbers::FIRST); // 输出 回退值类型:integer,值:1
processBackedEnum(Foo::BAR);       // 输出 回退值类型:string,值:bar
// processBackedEnum(Status::ACTIVE); // 抛出 TypeError,因为Status是非回退枚举
  • 仅接受非回退枚举:PHP没有对应专属接口,可在函数内添加检查过滤:
function processNonBackedEnum(UnitEnum $enumValue) {
    if ($enumValue instanceof BackedEnum) {
        throw new TypeError("仅接受非回退枚举");
    }
    echo "非回退枚举名称:" . $enumValue->name;
}

processNonBackedEnum(Status::ACTIVE); // 输出 非回退枚举名称:ACTIVE
// processNonBackedEnum(Numbers::FIRST); // 抛出 TypeError

3. 按回退类型区分(字符串/整数)

如果需要进一步限制回退枚举的具体类型,可在函数内检查回退值的类型:

仅接受字符串类型回退枚举

function processStringBackedEnum(BackedEnum $enumValue) {
    if (!is_string($enumValue->value)) {
        throw new TypeError("仅接受字符串类型回退枚举");
    }
    echo "字符串回退值:" . $enumValue->value;
}

processStringBackedEnum(Foo::BAR); // 输出 字符串回退值:bar
// processStringBackedEnum(Numbers::FIRST); // 抛出 TypeError

仅接受整数类型回退枚举

function processIntBackedEnum(BackedEnum $enumValue) {
    if (!is_int($enumValue->value)) {
        throw new TypeError("仅接受整数类型回退枚举");
    }
    echo "整数回退值:" . $enumValue->value;
}

processIntBackedEnum(Numbers::FIRST); // 输出 整数回退值:1
// processIntBackedEnum(Foo::BAR); // 抛出 TypeError

内容的提问来源于stack exchange,提问作者Ben Rowe

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.18 16:50:43