PHP Enum:从字符串获取枚举案例的策略与实践

PHP Enum:从字符串获取枚举案例的策略与实践

本文深入探讨了在php中如何根据字符串获取枚举(enum)案例的多种方法。我们将详细介绍针对支持值枚举(backedenums)的`tryfrom()`和`from()`原生方法,以及如何为不带值的枚举(simple enums)或需要通过案例名称获取时,实现自定义的静态辅助方法。文章旨在提供清晰的指导和代码示例,帮助开发者高效地处理枚举与字符串之间的转换。

在PHP 8.1及更高版本中引入的枚举(Enums)为我们提供了一种定义一组有限、命名值的方式,极大地提升了代码的可读性和类型安全性。根据其定义方式,枚举可分为两种类型:不带值的枚举(Simple Enums)和支持值枚举(BackedEnums)。理解这两种类型及其特性,是高效地从字符串获取枚举案例的基础。

1. 理解 PHP 枚举类型

1.1 不带值的枚举 (Simple Enums)

不带值的枚举,也称为纯枚举,其案例仅作为符号存在,不关联任何标量值。它们主要用于表示一组互斥的状态或选项。

<?phpenum Status{    case OK;    case FAILED;    case PENDING;}

1.2 支持值枚举 (BackedEnums)

支持值枚举允许每个案例关联一个明确的标量值(int 或 string)。这些值可以在外部系统(如数据库、API)中使用,从而实现枚举与外部数据源的无缝集成。

<?phpenum ErrorCode: int{    case SUCCESS = 0;    case NOT_FOUND = 404;    case SERVER_ERROR = 500;}enum HttpMethod: string{    case GET = "GET";    case POST = "POST";    case PUT = "PUT";}

2. 访问枚举案例的属性

无论是哪种枚举,都可以通过->name属性获取其案例的字符串名称。对于支持值枚举,还可以通过->value属性获取其关联的标量值。

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

name;  // 输出: "OK"echo Status::OK->value; // 输出: "OK" (对于string BackedEnum)enum SimpleStatus{    case ACTIVE;    case INACTIVE;}echo SimpleStatus::ACTIVE->name; // 输出: "ACTIVE"// SimpleStatus::ACTIVE->value; // 错误:Simple Enum 没有 value 属性

3. 原生方法:通过值获取支持值枚举 (BackedEnums) 案例

PHP为支持值枚举提供了原生的静态方法tryFrom()和from(),允许开发者通过其关联的标量值来获取对应的枚举案例。

3.1 BackedEnum::tryFrom(string|int $value)

此方法尝试根据提供的标量值查找并返回匹配的枚举案例。如果找不到匹配的案例,它将返回null。

<?phpenum Status: string{    case OK = "OK";    case FAILED = "FAILED";}$statusOk = Status::tryFrom("OK"); // 返回 Status::OKvar_dump($statusOk);$statusNotFound = Status::tryFrom("UNKNOWN"); // 返回 nullvar_dump($statusNotFound);enum ErrorCode: int{    case SUCCESS = 0;    case NOT_FOUND = 404;}$errorCode = ErrorCode::tryFrom(404); // 返回 ErrorCode::NOT_FOUNDvar_dump($errorCode);

3.2 BackedEnum::from(string|int $value)

与tryFrom()类似,但如果找不到匹配的案例,from()方法会抛出一个ValueError异常。这适用于你确定输入值一定有效,或者希望显式捕获并处理错误的情况。

getMessage() . "n";}

注意事项: tryFrom()和from()方法是针对支持值枚举的值进行匹配的,而不是案例名称。如果你的字符串是案例名称而不是值,这些方法将无法直接使用。

4. 自定义方法:通过名称获取枚举案例

对于不带值的枚举,或者当你想通过枚举案例的名称(而不是值)来获取案例时,PHP没有提供原生的静态方法。在这种情况下,你需要实现一个自定义的静态辅助方法。

一个常见的实现方式是遍历枚举的所有案例(通过Enum::cases()方法),然后比较每个案例的->name属性与输入的字符串。

name === $name) {                return $statusCase;            }        }        return null;    }}$statusOk = Status::get("OK"); // 返回 Status::OKvar_dump($statusOk);$statusPending = Status::get("pending "); // 返回 Status::PENDING (处理了大小写和空格)var_dump($statusPending);$statusNotFound = Status::get("UNKNOWN"); // 返回 nullvar_dump($statusNotFound);// 同样适用于 BackedEnum,如果你想通过名称而不是值获取enum HttpMethod: string{    case GET = "GET";    case POST = "POST";    public static function getByName(string $name): ?self    {        $name = strtoupper(trim($name));        if (empty($name)) {            return null;        }        foreach (self::cases() as $methodCase) {            if ($methodCase->name === $name) {                return $methodCase;            }        }        return null;    }}$method = HttpMethod::getByName("post"); // 返回 HttpMethod::POSTvar_dump($method);

这个自定义的get方法提供了强大的灵活性,可以根据你的需求添加额外的逻辑,例如处理大小写不敏感的匹配、去除空格等。

5. 选择合适的策略与最佳实践

使用支持值枚举 (BackedEnums) 和 tryFrom()/from(): 如果你的枚举案例与外部系统中的特定字符串或整数值直接关联,并且你希望通过这些值进行查找,那么使用支持值枚举是最佳选择。这提供了原生支持,代码简洁且性能高效。使用自定义 get 方法: 如果你的枚举是不带值的,或者你需要通过枚举案例的名称(而非其值)进行查找,那么实现一个自定义的静态方法是必要的。这种方法提供了最大的灵活性,可以根据实际需求定制匹配逻辑。错误处理: tryFrom()返回null,from()抛出ValueError。自定义方法通常返回null。选择哪种方式取决于你对未找到匹配情况的处理策略。大小写敏感性: 在实现自定义get方法时,请考虑是否需要进行大小写不敏感的匹配。使用strtoupper()、strtolower()或strcasecmp()可以实现这一目标。命名约定: 保持枚举案例名称与你期望通过字符串查找的名称之间的一致性,有助于减少混淆。

总结

从字符串获取PHP枚举案例的方法取决于枚举的类型以及你希望匹配的是案例的“值”还是“名称”。对于支持值枚举,tryFrom()和from()提供了高效的原生解决方案,通过匹配其关联的标量值来获取案例。然而,若要通过案例的字符串名称获取,尤其是不带值的枚举,则需要实现一个自定义的静态辅助方法,遍历所有案例并比较其->name属性。理解这些差异并选择合适的策略,将有助于你更有效地利用PHP枚举,编写出健壮且易于维护的代码。

以上就是PHP Enum:从字符串获取枚举案例的策略与实践的详细内容,更多请关注php中文网其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1340299.html

赞 (0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
PHP中利用PHPDoc与Psalm精确标注类字符串数组
上一篇 2025年12月13日 03:44:04
PHP操作MongoDB:获取服务器运行时间(Uptime)教程
下一篇 2025年12月13日 03:44:16

相关推荐

  • composer的vendor/bin目录下的文件是怎么生成的

    composer的vendor/bin目录下的文件是怎么生成的composer的vendor/bin目录下的文件是怎么生成的composer的vendor/bin目录下的文件是怎么生成的composer的vendor/bin目录下的文件是怎么生成的

    vendor/bin下的文件由Composer根据依赖包composer.json中的bin字段自动生成,通常是PHP可执行脚本,通过符号链接或复制方式创建,确保能访问项目自动加载环境,用于本地调用工具。 Composer 的 vendor/bin 目录下的文件是由 Composer 自动生成的,主…

    2026年10月9日 • 用户投稿
    100
  • 使用 Java Stream API 分割数据流并获取不同的集合

    使用 Java Stream API 分割数据流并获取不同的集合使用 Java Stream API 分割数据流并获取不同的集合使用 Java Stream API 分割数据流并获取不同的集合使用 Java Stream API 分割数据流并获取不同的集合

    本文将介绍如何使用 Java Stream API 有效地分割数据流,根据特定条件将元素划分到不同的集合中。通过 partitioningBy 收集器,我们可以将数据流分割成两个列表,分别包含满足条件和不满足条件的元素,从而避免使用传统的循环结构,提高代码的可读性和简洁性。 在实际开发中,我们经常需…

    2026年10月9日 • 用户投稿
    100
  • composer如何管理项目的PHP最低版本_Composer管理PHP最低版本方法

    composer如何管理项目的PHP最低版本_Composer管理PHP最低版本方法composer如何管理项目的PHP最低版本_Composer管理PHP最低版本方法composer如何管理项目的PHP最低版本_Composer管理PHP最低版本方法composer如何管理项目的PHP最低版本_Composer管理PHP最低版本方法

    Composer通过composer.json中require字段设置PHP最低版本,如”php”: “^8.1″表示需PHP 8.1及以上;也可用config.platform指定目标环境PHP版本以确保依赖兼容;通过composer show &#…

    2026年10月9日 • 用户投稿
    100
  • composer如何处理PHP的”mbstring”等多字节字符串扩展依赖

    composer如何处理PHP的”mbstring”等多字节字符串扩展依赖composer如何处理PHP的”mbstring”等多字节字符串扩展依赖composer如何处理PHP的”mbstring”等多字节字符串扩展依赖composer如何处理PHP的”mbstring”等多字节字符串扩展依赖

    Composer不安装PHP扩展,但通过ext-mbstring声明依赖并在platform中模拟环境,确保运行条件满足,同时可用symfony/polyfill-mbstring提供函数替代,最终需生产环境正确启用扩展。 Composer 本身不会直接安装 PHP 的扩展(如 mbstring),…

    2026年10月8日 • 用户投稿
    100
  • 如何选配腾讯云windows服务器?

    如何选配腾讯云windows服务器?如何选配腾讯云windows服务器?如何选配腾讯云windows服务器?如何选配腾讯云windows服务器?

    如何选择和配置php中文网的windows服务器? 搭建Windows云服务器是一个系统化的操作过程,需要对服务器和Windows Server系统有一定的了解。接下来,赵一八笔记将为大家详细介绍如何搭建Windows云服务器的步骤。 本文以PHP中文网服务器为例进行说明。 一、在购买PHP中文网之…

    2026年10月8日 • 用户投稿
    000
  • 使用 Java Stream API 分区数据流并获取不同的集合

    使用 Java Stream API 分区数据流并获取不同的集合使用 Java Stream API 分区数据流并获取不同的集合使用 Java Stream API 分区数据流并获取不同的集合使用 Java Stream API 分区数据流并获取不同的集合

    本文介绍如何使用 Java Stream API 将数据流按照特定条件进行分区,并将分区后的数据分别收集到不同的集合中。通过 Collectors.partitioningBy 方法,可以高效地将数据流划分为满足条件和不满足条件的两部分,从而避免使用传统的循环方式,简化代码并提高可读性。 使用 pa…

    2026年10月8日 • 用户投稿
    200
  • 耳夹耳机体验天花板!曝华为FreeClip 2代月底发布

    耳夹耳机体验天花板!曝华为FreeClip 2代月底发布耳夹耳机体验天花板!曝华为FreeClip 2代月底发布耳夹耳机体验天花板!曝华为FreeClip 2代月底发布耳夹耳机体验天花板!曝华为FreeClip 2代月底发布

    9月2日,据数码博主定焦数码透露,华为即将在9月下旬推出全新一代耳夹式耳机freeclip 2。 虽然新机外观预计与前代差别不大,但在音质表现、佩戴舒适度以及AI智能功能等方面或将迎来进一步优化升级,具体配置参数目前尚未公布。 回顾2023年12月,华为发布了首款开放式耳夹耳机FreeClip,首发…

    2026年10月8日 • 用户投稿
    000
  • composer的”artifact”仓库类型是什么

    composer的”artifact”仓库类型是什么composer的”artifact”仓库类型是什么composer的”artifact”仓库类型是什么composer的”artifact”仓库类型是什么

    artifact 仓库类型用于从本地压缩包加载PHP包,适合离线环境、私有库部署及CI/CD缓存;通过配置本地目录扫描ZIP或TAR文件,要求归档内含composer.json并定义包名版本,相比Packagist或VCS更稳定快速但需手动管理,适用于构建封闭可重复的部署环境。 Composer 的…

    2026年10月8日 • 用户投稿
    200
  • 通义灵码idea怎么安装不了怎么办

    通义灵码idea怎么安装不了怎么办通义灵码idea怎么安装不了怎么办通义灵码idea怎么安装不了怎么办通义灵码idea怎么安装不了怎么办

    通义灵码idea安装失败的常见原因包括:1.系统兼容性问题,需确认系统版本是否满足要求;2.网络连接问题,确保网络稳定;3.安装包损坏,需重新下载;4.权限问题,以管理员身份运行安装程序。 ☞☞☞AI 智能聊天, 问答助手, AI 智能搜索, 免费无限量使用 DeepSeek R1 模型☜☜☜ 通义…

    2026年10月8日 • 用户投稿
    200
  • 高效分割流数据:使用 Stream API 获取对象列表和缺失 ID 列表

    高效分割流数据:使用 Stream API 获取对象列表和缺失 ID 列表高效分割流数据:使用 Stream API 获取对象列表和缺失 ID 列表高效分割流数据:使用 Stream API 获取对象列表和缺失 ID 列表高效分割流数据:使用 Stream API 获取对象列表和缺失 ID 列表

    本文介绍了如何使用 Java Stream API 高效地处理 ID 列表,并根据 ID 是否存在于 Map 中,将其分割成包含对应对象的列表和包含缺失 ID 的列表。通过 partitioningBy 方法,避免了传统循环的冗余代码,使代码更简洁易懂。 在处理数据时,经常会遇到需要根据特定条件将数…

    2026年10月8日 • 用户投稿
    100
  • 如何实现ThinkPHP6的分页功能

    thinkphp是一款非常流行的php开发框架,其最新版本thinkphp6在性能和易用性方面都得到了很大的改善。分页功能是网页开发中非常常见的功能,而thinkphp6也提供了非常方便的分页方法。本文将介绍如何实现thinkphp6的分页功能。 一、了解分页功能 在Web应用程序中,当数据集非常庞…

    用户投稿 2026年10月8日
    100
  • laravel怎么导出CSV或Excel文件_laravel CSV/Excel文件导出方法

    Laravel 提供多种方式导出数据,推荐使用 Laravel-Excel 扩展包实现 Excel 文件导出,支持样式定制与大数据优化;也可手动构建 CSV 响应流,结合查询构造器的 cursor 或 chunk 方法分批处理,避免内存溢出,适用于报表生成与数据备份场景。 如果您需要将数据库中的数据…

    2026年10月8日
    100
  • 检查整数是否为完全平方数(不使用 Math.sqrt)

    检查整数是否为完全平方数(不使用 Math.sqrt)检查整数是否为完全平方数(不使用 Math.sqrt)检查整数是否为完全平方数(不使用 Math.sqrt)检查整数是否为完全平方数(不使用 Math.sqrt)

    本文详细介绍了如何在不使用 Math.sqrt 方法的情况下,通过迭代算法判断一个整数是否为完全平方数。文章从完全平方数的定义出发,逐步讲解了高效的迭代检查逻辑,提供了优化的 Java 示例代码,并讨论了循环条件、潜在的整数溢出问题及边缘情况处理,旨在提供一个清晰、专业的教程。 什么是完全平方数? …

    2026年10月8日 • 用户投稿
    200
  • composer的–optimize-autoloader是生产环境的必选项吗

    composer的–optimize-autoloader是生产环境的必选项吗composer的–optimize-autoloader是生产环境的必选项吗composer的–optimize-autoloader是生产环境的必选项吗composer的–optimize-autoloader是生产环境的必选项吗

    启用 –optimize-autoloader 能显著提升生产环境性能,通过生成静态映射表减少文件查找,加快类加载速度,尤其在大型项目中效果明显;推荐在 composer install 或 dump-autoload 时使用该选项,特别是在容器化部署和 CI/CD 流程中结合 &#82…

    2026年10月8日 • 用户投稿
    100
  • Java中不使用Math.sqrt函数判断一个数是否为完全平方数

    Java中不使用Math.sqrt函数判断一个数是否为完全平方数Java中不使用Math.sqrt函数判断一个数是否为完全平方数Java中不使用Math.sqrt函数判断一个数是否为完全平方数Java中不使用Math.sqrt函数判断一个数是否为完全平方数

    本教程旨在探讨在Java中不依赖Math.sqrt函数的情况下,如何判断一个整数是否为完全平方数。文章将首先分析常见错误,随后详细介绍两种迭代检测方法:一种是直接比较平方值,另一种是利用除数与商的关系。通过代码示例和注意事项,帮助读者理解并实现高效的完全平方数判断逻辑。 什么是完全平方数? 完全平方…

    2026年10月8日 • 用户投稿
    000
  • iPhone 17要火!调查称将近70%用户计划入手iPhone 17系列

    iPhone 17要火!调查称将近70%用户计划入手iPhone 17系列iPhone 17要火!调查称将近70%用户计划入手iPhone 17系列iPhone 17要火!调查称将近70%用户计划入手iPhone 17系列iPhone 17要火!调查称将近70%用户计划入手iPhone 17系列

    9月2日,智能手机比价平台sellcell公布了针对iphone用户的最新调查结果:超过六成用户有意购买iphone 17系列,电池续航被列为最期待的升级点。 该调查于8月份在美国展开,共收集了2000多名iPhone用户的数据,旨在分析消费者的换机意向与品牌忠诚度。结果显示,68.3%的现有iPh…

    2026年10月8日 • 用户投稿
    200
  • Java/Processing中实体平滑移动:基于速度和向量的目标坐标控制

    Java/Processing中实体平滑移动:基于速度和向量的目标坐标控制Java/Processing中实体平滑移动:基于速度和向量的目标坐标控制Java/Processing中实体平滑移动:基于速度和向量的目标坐标控制Java/Processing中实体平滑移动:基于速度和向量的目标坐标控制

    本文详细阐述了如何在Java/Processing环境中,通过向量数学实现游戏或模拟中实体的平滑移动,而非直接瞬移。我们将学习如何计算目标方向向量、利用指定速度更新实体位置,并确保精确到达目标点,为游戏开发中的动态对象控制提供基础方法。 1. 问题背景与传统方法局限 在游戏或模拟开发中,我们经常需要…

    2026年10月8日 • 用户投稿
    100
  • Java实体平滑移动:基于速度和目标坐标的向量控制教程

    Java实体平滑移动:基于速度和目标坐标的向量控制教程Java实体平滑移动:基于速度和目标坐标的向量控制教程Java实体平滑移动:基于速度和目标坐标的向量控制教程Java实体平滑移动:基于速度和目标坐标的向量控制教程

    本教程详细介绍了如何在Java中实现游戏或图形实体从当前位置平滑移动到指定目标位置,而非瞬时跳转。通过引入向量概念和PVector库(或其他类似数学库),我们将学习如何计算方向、应用速度,并确保实体在接近目标时准确停止,从而实现流畅自然的运动效果。 引言:平滑移动的需求 在游戏开发或图形应用中,我们…

    2026年10月8日 • 用户投稿
    000
  • 深入理解Java并发:Future.get()与ExecutorService.awaitTermination()的超时机制解析

    深入理解Java并发:Future.get()与ExecutorService.awaitTermination()的超时机制解析深入理解Java并发:Future.get()与ExecutorService.awaitTermination()的超时机制解析深入理解Java并发:Future.get()与ExecutorService.awaitTermination()的超时机制解析深入理解Java并发:Future.get()与ExecutorService.awaitTermination()的超时机制解析

    本文深入探讨了Java并发编程中Future.get()方法与ExecutorService.awaitTermination()方法结合使用时的超时行为。通过具体代码示例,详细分析了当Future.get()设置了独立超时,而ExecutorService又设置了总的终止超时时,实际等待时间如何累…

    2026年10月8日 • 用户投稿
    100
  • Java中如何实现动态代理?CGLib与JDK Proxy对比

    Java中如何实现动态代理?CGLib与JDK Proxy对比Java中如何实现动态代理?CGLib与JDK Proxy对比Java中如何实现动态代理?CGLib与JDK Proxy对比Java中如何实现动态代理?CGLib与JDK Proxy对比

    jdk proxy基于接口,通过反射生成代理类,适用于有接口的目标对象;cglib通过字节码生成子类,适用于无接口的类。1. jdk proxy要求目标类实现接口,通过invocationhandler拦截方法调用,适合接口编程场景。2. cglib不依赖接口,使用methodinterceptor…

    2026年10月8日 • 用户投稿
    100

发表回复

登录后才能评论
关注微信