PHP Conference Japan 2024

枚举静态方法

枚举也可以有静态方法。枚举本身使用静态方法的主要目的是为了提供备选构造函数。例如:

<?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 条注释

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');
}
}

?>
joe502357217 at qq dot com
1 年前
您只需使用以下代码替换 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());
?>
Ulf
1 年前
请注意,枚举在内部声明为 final,因此不能相互扩展(尽管它们被允许扩展其他类)。

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

参见:https://php.watch/versions/8.1/enums#enum-inheritance
Aaron Saray
2 年前
需要立即从支持枚举中检索所有名称和值(用于类似选择框的内容)并且您不想循环遍历 `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 中,并在需要此功能的任何枚举中使用它。
lokashafeek7755 at gmail dot com
1 年前
如果要为 `forSelect` 方法中的每个枚举值补充键值对以及其他描述,可以修改数组结构以包含每个枚举值的关联数组。以下是一个示例

<?php

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

public static function
forSelect(): array
{
return [
self::Male->value => [
'label' => '男',
'description' => '这是男性性别',
],
self::Female->value => [
'label' => '女',
'description' => '这是女性性别',
],
];
}

}
?>

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

请注意,要访问特定枚举值的标签和描述,您需要使用相应的数组键。例如,要获取男性性别的标签,您可以使用 self::forSelect()[self::Male->value]['label']。
To Top