枚举静态方法

枚举也可以拥有静态方法。枚举本身使用静态方法主要用于替代构造函数。例如:

<?php

enum Size
{
case
Small;
case
Medium;
case
Large;

public static function
fromLength(int $cm): static
{
return match(
true) {
$cm < 50 => static::Small,
$cm < 100 => static::Medium,
default => static::
Large,
};
}
}
?>

静态方法可以是公共、私有或受保护的,尽管在实践中私有和受保护是等效的,因为不允许继承。

添加笔记

用户贡献笔记 5 个笔记

61
niloofarfs
2 年前
要获取作为数组的所有带支持的枚举的标量等效值,可以在枚举中定义一个方法

<?php

enum Suit: string
{
case
Hearts = 'H';
case
Diamonds = 'D';
case
Clubs = 'C';
case
Spades = 'S';

public static function
values(): array
{
return
array_column(self::cases(), 'value');
}
}

?>
8
joe502357217 at qq dot com
11 个月前
您只需要使用以下代码替换 Aaron Saray 提供的示例。
这段代码更简洁。

<?php
enum Suit: string
{
case
Hearts = 'H';
case
Diamonds = 'D';
case
Clubs = 'C';
case
Spades = 'S';

public static function
forSelect(): array
{
return
array_column(self::cases(), 'name', 'value');
}
}

var_dump(Suit::forSelect());
?>
2
lokashafeek7755 at gmail dot com
10 个月前
如果您想在 forSelect 方法中为每个枚举值添加额外的描述以补充键值对,您可以修改数组结构以在每个枚举值中包含一个关联数组。以下是一个示例

<?php

enum Gender:int
{
case
Male = 1;
case
Female = 2;

public static function
forSelect(): array
{
return [
self::Male->value => [
'label' => 'Male',
'description' => 'This is the Male gender',
],
self::Female->value => [
'label' => 'Female',
'description' => 'This is the Female gender',
],
];
}

}
?>

在此更新的示例中,每个枚举值都表示为一个关联数组,包含两个键:“label”和“description”。您可以根据需要自定义每个枚举值的标签和描述。

请注意,要访问特定枚举值的标签和描述,您需要使用相应的数组键。例如,要获取男性性别的标签,您可以使用 self::forSelect()[self::Male->value]['label']。
9
Aaron Saray
1 年前
需要从带支持的枚举中立即检索所有名称和值(例如用于选择框),并且您不想循环遍历 `Enum::cases()`?试试这个

<?php
enum Suit: string
{
case
Hearts = 'H';
case
Diamonds = 'D';
case
Clubs = 'C';
case
Spades = 'S';

public static function
forSelect(): array
{
return
array_combine(
array_column(self::cases(), 'value'),
array_column(self::cases(), 'name')
);
}
}

Suit::forSelect();
?>

将 `forSelect()` 放入一个 trait 中,并在需要此功能的任何枚举中使用它。
0
Ulf
10 个月前
注意,枚举在内部声明为 final,因此不能相互扩展(尽管它们被允许扩展其他类)。

这也意味着,此页面示例中的 "Size::fromLength()" 方法冗余地使用了 "static::"(因为不需要延迟静态绑定),并且可以轻松地使用 "self::" 或 "Size::" 代替。

请参阅:https://php.watch/versions/8.1/enums#enum-inheritance
To Top