是否可以将参数的类型定义为枚举值?

问题描述 投票:0回答:2

函数的参数中,是否可以指定一些枚举值?

例如,代替这个:

public function getValuesFromType(string $type) { /*...*/ }

我只想允许一些特定的值 - 像这样的伪代码:

public function getValuesFromType('a'||'b' $type) { /*...*/ }

我尝试创建一个包含值的 Enum 对象,并在类型中添加 Enum。但是当函数

getValuesFromType('a')
运行时,会出现错误提示
argument 1 must be of type MyTypeEnum, string given
...

public function getValuesFromType(MyTypeEnum $type)

如何限制可以作为参数传递给此方法的值?

php enums signature
2个回答
3
投票

哦天哪,我是 Enum 的超级粉丝。

让我们使用以下枚举作为示例:

enum MyTypeEnum
{
    case APPLE = 'apple';
    case BANANA = 'banana';
}

如果您知道您将拥有 MyTypeEnum 的实例,则可以将其用作类型提示:


public function getValuesFromType(MyTypeEnum $type)

因此您可以使用 MyTypeEnum 实例作为参数:

$this->getValuesFromType(MyTypeEnum::APPLE)

但是如果您不知道参数是什么,请输入提示为

string
并在 MyTypeEnum 上使用
from()
tryFrom()
静态函数。


public function getValuesFromType(string $type) {
    $myType = MyTypeEnum::tryFrom($type);

    if (!$myType) {
       // handle null state
    }

    // $myType is a valid MyTypeEnum instance
}
如果值与任何大小写都不匹配,

from()
将抛出异常,
tryFrom()
将简单地返回
null

但是还有第三种方法,我喜欢使用:

如果将函数添加到枚举中,则可以在实例上调用它:

enum MyTypeEnum
{
    case APPLE = 'apple';
    case BANANA = 'banana';

    public function values() {
        return match($this) {
            self::APPLE => ['red', 'green'],
            self::BANANA => ['yellow', 'brown']
        }
    }
}

用途:

MyTypeEnum::tryFrom('apple')?->values() // return ['red', 'green']
MyTypeEnum::tryFrom('orange')?->values() // return null
MyTypeEnum::tryFrom('orange')?->values() ?? [] // return []

如果您需要联合类型,则需要单个

|
字符。

public function getValuesFromType(string|array $type)

但是您不能使用

'a' | 'b'
MyTypeEnum::APPLE | MyTypeEnum::BANANA
。类型必须是简单的(如
string $type
)或复杂的实例(如
MyTypeEnum $type
)。


0
投票
  • PHP 8.3
  • Symfony 6.3

如果您遇到此错误:编译错误:非支持枚举 App\Enum\EnumChoice 的 Case CHOICE_ONE 不得有值,请确保您的枚举如下所示(添加 string 类型):

<?php

namespace App\Enum;

enum EnumChoice:string {
    case CHOICE_ONE = 'ONE';
    case CHOICE_TWO = 'TWO';
}
© www.soinside.com 2019 - 2024. All rights reserved.