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

vte*_*eck 1 php enums signature

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

例如,代替这个:

public function getValuesFromType(string $type) { /*...*/ }
Run Code Online (Sandbox Code Playgroud)

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

public function getValuesFromType('a'||'b' $type) { /*...*/ }
Run Code Online (Sandbox Code Playgroud)

我尝试创建一个包含值的枚举对象,并在类型中添加枚举。但是当该函数getValuesFromType('a')运行时,会出现错误argument 1 must be of type MyTypeEnum, string given...

public function getValuesFromType(MyTypeEnum $type)
Run Code Online (Sandbox Code Playgroud)

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

小智 6

噢,天啊,我是 Enum 的超级粉丝。

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

enum MyTypeEnum
{
    case APPLE = 'apple';
    case BANANA = 'banana';
}
Run Code Online (Sandbox Code Playgroud)

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


public function getValuesFromType(MyTypeEnum $type)
Run Code Online (Sandbox Code Playgroud)

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

$this->getValuesFromType(MyTypeEnum::APPLE)
Run Code Online (Sandbox Code Playgroud)

但如果您不知道参数是什么,请输入提示 asstring并在 MyTypeEnum 上使用from()tryFrom()静态函数。


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

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

    // $myType is a valid MyTypeEnum instance
}
Run Code Online (Sandbox Code Playgroud)

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']
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

用法:

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

如果您需要联合类型,则需要单个|字符。

public function getValuesFromType(string|array $type)

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