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。