
php 8.1引入了对枚举(enums)的原生支持,为定义一组有限的、命名常量提供了强大的类型安全机制。在实际开发中,我们经常需要获取枚举的所有成员,无论是其名称(例如hearts)还是其关联的原始值(例如h)。
所有枚举类型都提供了一个静态方法 cases(),它返回一个包含所有枚举实例的数组。这是获取枚举所有成员的基础。
enum Suit
{
case Hearts;
case Diamonds;
case Clubs;
case Spades;
}
// 获取所有Suit枚举成员
$allSuits = Suit::cases();
/*
$allSuits 会是一个包含以下对象的数组:
[
Suit::Hearts,
Suit::Diamonds,
Suit::Clubs,
Suit::Spades
]
*/对于没有关联值的基本枚举(Pure Enums),我们可以通过访问每个枚举实例的 name 属性来获取其名称。结合 array_column 函数,可以简洁地提取所有名称。
enum Suit
{
case Hearts;
case Diamonds;
case Clubs;
case Spades;
}
$suitNames = array_column(Suit::cases(), 'name');
/*
$suitNames 会是:
[
'Hearts',
'Diamonds',
'Clubs',
'Spades'
]
*/如果枚举是“Backed Enum”(支持枚举),即每个枚举成员都关联了一个标量值(字符串或整数),我们可以通过访问每个枚举实例的 value 属性来获取这些关联值。同样,array_column 是一个非常方便的工具。
enum Suit: string
{
case Hearts = 'H';
case Diamonds = 'D';
case Clubs = 'C';
case Spades = 'S';
}
$suitValues = array_column(Suit::cases(), 'value');
/*
$suitValues 会是:
[
'H',
'D',
'C',
'S'
]
*/为了避免在多个枚举中重复编写获取名称和值的逻辑,我们可以创建一个PHP特性(Trait)来封装这些常用操作。这样不仅能提高代码的复用性,还能使枚举定义更加清晰。
立即学习“PHP免费学习笔记(深入)”;
以下是一个名为 EnumToArray 的特性,它提供了三个静态方法:names()、values() 和 array()。
trait EnumToArray
{
/**
* 获取所有枚举成员的名称。
* @return array
*/
public static function names(): array
{
// self::cases() 在使用此trait的枚举上下文中有效
return array_column(self::cases(), 'name');
}
/**
* 获取所有Backed枚举成员的关联值。
* 仅适用于Backed Enum。
* @return array
*/
public static function values(): array
{
// self::cases() 在使用此trait的枚举上下文中有效
return array_column(self::cases(), 'value');
}
/**
* 获取一个以关联值为键,名称为值的数组。
* 仅适用于Backed Enum。
* @return array
*/
public static function array(): array
{
// 结合values()和names()方法
return array_combine(self::values(), self::names());
}
}要使用这个特性,只需在你的枚举定义中通过 use EnumToArray; 引入即可。
enum Suit: string
{
use EnumToArray; // 引入特性
case Hearts = 'H';
case Diamonds = 'D';
case Clubs = 'C';
case Spades = 'S';
}
// 使用特性提供的方法
$suitNames = Suit::names();
/*
$suitNames 会是:
[
'Hearts',
'Diamonds',
'Clubs',
'Spades'
]
*/
$suitValues = Suit::values();
/*
$suitValues 会是:
[
'H',
'D',
'C',
'S'
]
*/
$suitMap = Suit::array();
/*
$suitMap 会是:
Array
(
[H] => Hearts
[D] => Diamonds
[C] => Clubs
[S] => Spades
)
*/PHP 8.1 引入的枚举功能极大地提升了代码的类型安全性和可读性。通过 Enum::cases() 方法,我们可以轻松获取所有枚举成员。结合 array_column,可以方便地提取成员名称或关联值。更进一步,利用特性(Trait)封装这些常用操作,如 EnumToArray 所示,可以有效地提高代码的复用性和维护性,使得枚举值的管理更加优雅和高效。在设计和使用枚举时,选择合适的策略来访问和操作其数据,将有助于构建更健壮、更易于维护的PHP应用程序。
以上就是PHP枚举值获取:全面指南与实用技巧的详细内容,更多请关注php中文网其它相关文章!
PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号