本文旨在解决在 php 中如何根据字符串名称获取非 backed enum 的枚举案例。由于非 backed enum 不支持 `tryfrom` 或 `from` 方法,文章将详细介绍通过自定义静态方法遍历枚举所有案例并进行名称匹配的实现方案,并提供示例代码和相关注意事项,帮助开发者有效管理和使用非 backed enum。
PHP 8.1 引入了枚举(Enums),为开发者提供了一种定义一组命名常量的新方式。在 PHP 中,枚举分为两种主要类型:
纯枚举(Pure Enums / Plain Enums):这类枚举只包含案例名称,没有关联的具体值。例如:
对于纯枚举的案例,可以通过 Status::OK->name 获取其字符串名称 "OK"。
支持值枚举(Backed Enums):这类枚举的每个案例都关联一个具体的值,可以是字符串或整数。例如:
支持值枚举的案例除了 name 属性外,还拥有 value 属性,例如 Status::OK->value 将返回 "success"。更重要的是,Backed Enums 提供了 from() 和 tryFrom() 静态方法,允许开发者通过关联值(而非案例名称)直接获取对应的枚举案例。例如 Status::tryFrom("success") 将返回 Status::OK。
开发中常见的一种需求是,给定一个字符串(通常是枚举案例的名称),需要获取对应的枚举案例实例。对于 Backed Enum,如果字符串恰好是其关联值,可以直接使用 tryFrom() 方法。然而,对于纯枚举,我们没有关联值,也无法直接使用 tryFrom() 方法(因为它期望的是关联值而不是案例名称)。
例如,我们希望实现类似 Status::get("OK") 的功能,使其返回 Status::OK 实例,但又不希望将 Status 定义为 Backed Enum(即避免 case OK = "OK"; 这种重复定义)。
由于 PHP 的纯枚举没有内置的通过名称查找案例的方法,最直接和推荐的解决方案是在枚举类内部实现一个自定义的静态方法来完成此功能。核心思路是遍历枚举的所有案例,并比较每个案例的 name 属性与传入的字符串是否匹配。
以下是一个实现此功能的示例代码:
name === $normalizedName) {
return $status; // 找到匹配项,返回该案例
}
}
// 未找到匹配的案例则返回 null
return null;
}
}
// 示例用法
$statusOk = Status::get("OK"); // 返回 Status::OK
$statusFailed = Status::get(" failed "); // 经过内部处理,返回 Status::FAILED
$statusPending = Status::get("pending"); // 经过内部处理,返回 Status::
PENDING
$statusNotFound = Status::get("UNKNOWN"); // 未找到,返回 null
var_dump($statusOk);
var_dump($statusFailed);
var_dump($statusPending);
var_dump($statusNotFound);
// 输出示例:
// object(Status)#1 (0) {
// }
// object(Status)#2 (0) {
// }
// object(Status)#3 (0) {
// }
// NULL
?>尽管 PHP 的纯枚举没有像 Backed Enum 那样内置 tryFrom() 或 from() 方法来通过字符串名称获取案例,但通过在枚举类中实现一个自定义的静态查找方法,可以优雅且高效地解决这一问题。这种方法利用了 self::cases() 提供的所有枚举案例列表,结合字符串处理和比较逻辑,实现了灵活的案例查找功能,同时保持了代码的清晰性和可维护性。理解纯枚举和 Backed Enum 的区别,并根据具体需求选择合适的实现方式,是有效利用 PHP 枚举的关键。
# php
# ai
# 区别
# 性能瓶颈
# 代码可读性
# Static
# String
# Array
# NULL
# 常量
# if
# foreach
# 面向对象
# 封装
# enum
# 字符串
# 循环
# public
# private
# Nullable
# function
# 对象
# 遍历
# 自定义
# 未找到
# 的是
# 这类
# 这样做
# 可以直接
# 转换为
# 类中
# 是一个
相关文章:
如何在宝塔面板创建新站点?
智能起名网站制作软件有哪些,制作logo的软件?
高端建站如何打造兼具美学与转化的品牌官网?
如何用手机制作网站和网页,手机移动端的网站能制作成中英双语的吗?
青浦网站制作公司有哪些,苹果官网发货地是哪里?
盐城做公司网站,江苏电子版退休证办理流程?
枣阳网站制作,阳新火车站打的到仙岛湖多少钱?
成都响应式网站开发,dw怎么把手机适应页面变成网页?
中山网站制作网页,中山新生登记系统登记流程?
如何通过山东自助建站平台快速注册域名?
惠州网站建设制作推广,惠州市华视达文化传媒有限公司怎么样?
如何在橙子建站中快速调整背景颜色?
Swift中循环语句中的转移语句 break 和 continue
,石家庄四十八中学官网?
如何在万网ECS上快速搭建专属网站?
如何用景安虚拟主机手机版绑定域名建站?
韩国网站服务器搭建指南:VPS选购、域名解析与DNS配置推荐
网站制作的软件有哪些,制作微信公众号除了秀米还有哪些比较好用的平台?
建站之星备案是否影响网站上线时间?
兔展官网 在线制作,怎样制作微信请帖?
内部网站制作流程,如何建立公司内部网站?
宠物网站制作html代码,有没有专门介绍宠物如何养的网站啊?
浅谈Javascript中的Label语句
如何在腾讯云服务器快速搭建个人网站?
宝华建站服务条款解析:五站合一功能与SEO优化设置指南
如何用VPS主机快速搭建个人网站?
香港服务器网站推广:SEO优化与外贸独立站搭建策略
长春网站建设制作公司,长春的网络公司怎么样主要是能做网站的?
文字头像制作网站推荐软件,醒图能自动配文字吗?
网站按钮制作软件,如何实现网页中按钮的自动点击?
Avalonia如何实现跨窗口通信 Avalonia窗口间数据传递
如何在搬瓦工VPS快速搭建网站?
网站制作员失业,怎样查看自己网站的注册者?
在线制作视频的网站有哪些,电脑如何制作视频短片?
整蛊网站制作软件,手机不停的收到各种网站的验证码短信,是手机病毒还是人为恶搞?有这种手机病毒吗?
建站之星如何快速生成多端适配网站?
深圳 网站制作,深圳招聘网站哪个比较好一点啊?
宝塔建站后网页无法访问如何解决?
c# 在高并发下使用反射发射(Reflection.Emit)的性能
公司网站的制作公司,企业网站制作基本流程有哪些?
网页设计网站制作软件,microsoft office哪个可以创建网页?
,南京靠谱的征婚网站?
北京网站制作公司哪家好一点,北京租房网站有哪些?
定制建站哪家更专业可靠?推荐榜单揭晓
再谈Python中的字符串与字符编码(推荐)
详解ASP.NET 生成二维码实例(采用ThoughtWorks.QRCode和QrCode.Net两种方式)
如何通过wdcp面板快速创建网站?
金*站制作公司有哪些,金华教育集团官网?
如何挑选优质建站一级代理提升网站排名?
如何在云虚拟主机上快速搭建个人网站?
*请认真填写需求信息,我们会在24小时内与您取得联系。