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