要获取作为数组的所有带支持的枚举的标量等效值,可以在枚举中定义一个方法
<?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');
}
}
?>
枚举也可以拥有静态方法。枚举本身使用静态方法主要用于替代构造函数。例如:
<?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,
};
}
}
?>
静态方法可以是公共、私有或受保护的,尽管在实践中私有和受保护是等效的,因为不允许继承。
要获取作为数组的所有带支持的枚举的标量等效值,可以在枚举中定义一个方法
<?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');
}
}
?>
您只需要使用以下代码替换 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());
?>
如果您想在 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']。
需要从带支持的枚举中立即检索所有名称和值(例如用于选择框),并且您不想循环遍历 `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 中,并在需要此功能的任何枚举中使用它。
注意,枚举在内部声明为 final,因此不能相互扩展(尽管它们被允许扩展其他类)。
这也意味着,此页面示例中的 "Size::fromLength()" 方法冗余地使用了 "static::"(因为不需要延迟静态绑定),并且可以轻松地使用 "self::" 或 "Size::" 代替。
请参阅:https://php.watch/versions/8.1/enums#enum-inheritance