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

8zzbczxx  于 2023-05-05  发布在  PHP
关注(0)|答案(1)|浏览(113)

在函数的参数中,是否可以指定一些枚举值?
例如,而不是这样:

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)

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

4dbbbstv

4dbbbstv1#

我是Enum的超级粉丝。
让我们使用下面的枚举作为示例:

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

如果你知道你将拥有MyTypeEnum的示例,你可以将它用作typehint:

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)。

相关问题