函数的参数中,是否可以指定一些枚举值?
例如,代替这个:
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)
如何限制可以作为参数传递给此方法的值?
哦天哪,我是 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
)。
如果您遇到此错误:编译错误:非支持枚举 App\Enum\EnumChoice 的 Case CHOICE_ONE 不得有值,请确保您的枚举如下所示(添加 string 类型):
<?php
namespace App\Enum;
enum EnumChoice:string {
case CHOICE_ONE = 'ONE';
case CHOICE_TWO = 'TWO';
}