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
相关产品推荐
相关产品推荐

