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 年前
請注意,列舉 (enum) 在內部被宣告為 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' => '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']。
To Top