0

0

PHP枚举值获取:全面指南与实用技巧

心靈之曲

心靈之曲

发布时间:2025-09-05 17:45:18

|

387人浏览过

|

来源于php中文网

原创

PHP枚举值获取:全面指南与实用技巧

本文详细介绍了在PHP 8.1及更高版本中如何高效地获取枚举(Enum)的所有成员名称和关联值。通过Enum::cases()方法结合array_column,以及引入一个可复用的EnumToArray特性,本教程将帮助开发者以结构化且优雅的方式管理和访问枚举数据,提升代码的可读性和维护性。

PHP枚举基础与值获取

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枚举的关联值

如果枚举是“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'
]
*/

使用特性(Trait)封装枚举值获取逻辑

为了避免在多个枚举中重复编写获取名称和值的逻辑,我们可以创建一个PHP特性(Trait)来封装这些常用操作。这样不仅能提高代码的复用性,还能使枚举定义更加清晰。

立即学习PHP免费学习笔记(深入)”;

Sapling AI Content Detector
Sapling AI Content Detector

Sapling.ai推出的免费在线AI内容检测工具

下载

EnumToArray 特性定义

以下是一个名为 EnumToArray 的特性,它提供了三个静态方法:names()、values() 和 array()。

  • names():返回所有枚举成员的名称数组。
  • values():返回所有Backed枚举成员的关联值数组。
  • 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());
    }
}

在枚举中使用 EnumToArray 特性

要使用这个特性,只需在你的枚举定义中通过 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
)
*/

注意事项

  • Trait的适用性: EnumToArray 特性中的 values() 和 array() 方法是为 Backed Enum 设计的。如果将其用于 Pure Enum(无关联值的枚举),array_column(self::cases(), 'value') 会导致错误,因为 Pure Enum 的实例没有 value 属性。在实际应用中,可以考虑为 Pure Enum 和 Backed Enum 分别创建不同的特性,或者在特性内部进行类型检查。
  • 性能考量: Enum::cases() 在每次调用时都会返回一个新的数组,但其内部实现通常会缓存枚举实例,因此重复调用不会造成显著性能问题。array_column 也是一个高效的数组操作函数。
  • PHP版本要求: 枚举功能仅在 PHP 8.1 及更高版本中可用。

总结

PHP 8.1 引入的枚举功能极大地提升了代码的类型安全性和可读性。通过 Enum::cases() 方法,我们可以轻松获取所有枚举成员。结合 array_column,可以方便地提取成员名称或关联值。更进一步,利用特性(Trait)封装这些常用操作,如 EnumToArray 所示,可以有效地提高代码的复用性和维护性,使得枚举值的管理更加优雅和高效。在设计和使用枚举时,选择合适的策略来访问和操作其数据,将有助于构建更健壮、更易于维护的PHP应用程序。

相关文章

PHP速学教程(入门到精通)
PHP速学教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
php文件怎么打开
php文件怎么打开

打开php文件步骤:1、选择文本编辑器;2、在选择的文本编辑器中,创建一个新的文件,并将其保存为.php文件;3、在创建的PHP文件中,编写PHP代码;4、要在本地计算机上运行PHP文件,需要设置一个服务器环境;5、安装服务器环境后,需要将PHP文件放入服务器目录中;6、一旦将PHP文件放入服务器目录中,就可以通过浏览器来运行它。

2730

2023.09.01

php怎么取出数组的前几个元素
php怎么取出数组的前几个元素

取出php数组的前几个元素的方法有使用array_slice()函数、使用array_splice()函数、使用循环遍历、使用array_slice()函数和array_values()函数等。本专题为大家提供php数组相关的文章、下载、课程内容,供大家免费下载体验。

1669

2023.10.11

php反序列化失败怎么办
php反序列化失败怎么办

php反序列化失败的解决办法检查序列化数据。检查类定义、检查错误日志、更新PHP版本和应用安全措施等。本专题为大家提供php反序列化相关的文章、下载、课程内容,供大家免费下载体验。

1530

2023.10.11

php怎么连接mssql数据库
php怎么连接mssql数据库

连接方法:1、通过mssql_系列函数;2、通过sqlsrv_系列函数;3、通过odbc方式连接;4、通过PDO方式;5、通过COM方式连接。想了解php怎么连接mssql数据库的详细内容,可以访问下面的文章。

974

2023.10.23

php连接mssql数据库的方法
php连接mssql数据库的方法

php连接mssql数据库的方法有使用PHP的MSSQL扩展、使用PDO等。想了解更多php连接mssql数据库相关内容,可以阅读本专题下面的文章。

1444

2023.10.23

html怎么上传
html怎么上传

html通过使用HTML表单、JavaScript和PHP上传。更多关于html的问题详细请看本专题下面的文章。php中文网欢迎大家前来学习。

1235

2023.11.03

PHP出现乱码怎么解决
PHP出现乱码怎么解决

PHP出现乱码可以通过修改PHP文件头部的字符编码设置、检查PHP文件的编码格式、检查数据库连接设置和检查HTML页面的字符编码设置来解决。更多关于php乱码的问题详情请看本专题下面的文章。php中文网欢迎大家前来学习。

1529

2023.11.09

php文件怎么在手机上打开
php文件怎么在手机上打开

php文件在手机上打开需要在手机上搭建一个能够运行php的服务器环境,并将php文件上传到服务器上。再在手机上的浏览器中输入服务器的IP地址或域名,加上php文件的路径,即可打开php文件并查看其内容。更多关于php相关问题,详情请看本专题下面的文章。php中文网欢迎大家前来学习。

1307

2023.11.13

Java编译相关教程合集
Java编译相关教程合集

本专题整合了Java编译相关教程,阅读专题下面的文章了解更多详细内容。

0

2026.01.21

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
PHP课程
PHP课程

共137课时 | 9万人学习

JavaScript ES5基础线上课程教学
JavaScript ES5基础线上课程教学

共6课时 | 9万人学习

PHP新手语法线上课程教学
PHP新手语法线上课程教学

共13课时 | 0.9万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号