
本文深入探讨了在php中如何根据字符串获取枚举(enum)案例的多种方法。我们将详细介绍针对支持值枚举(backedenums)的`tryfrom()`和`from()`原生方法,以及如何为不带值的枚举(simple enums)或需要通过案例名称获取时,实现自定义的静态辅助方法。文章旨在提供清晰的指导和代码示例,帮助开发者高效地处理枚举与字符串之间的转换。
在PHP 8.1及更高版本中引入的枚举(Enums)为我们提供了一种定义一组有限、命名值的方式,极大地提升了代码的可读性和类型安全性。根据其定义方式,枚举可分为两种类型:不带值的枚举(Simple Enums)和支持值枚举(BackedEnums)。理解这两种类型及其特性,是高效地从字符串获取枚举案例的基础。
不带值的枚举,也称为纯枚举,其案例仅作为符号存在,不关联任何标量值。它们主要用于表示一组互斥的状态或选项。
<?php
enum Status
{
case OK;
case FAILED;
case PENDING;
}支持值枚举允许每个案例关联一个明确的标量值(int 或 string)。这些值可以在外部系统(如数据库、API)中使用,从而实现枚举与外部数据源的无缝集成。
<?php
enum 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";
}无论是哪种枚举,都可以通过->name属性获取其案例的字符串名称。对于支持值枚举,还可以通过->value属性获取其关联的标量值。
立即学习“PHP免费学习笔记(深入)”;
<?php
enum Status: string // 示例使用 BackedEnum
{
case OK = "OK";
case FAILED = "FAILED";
}
echo Status::OK->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 属性PHP为支持值枚举提供了原生的静态方法tryFrom()和from(),允许开发者通过其关联的标量值来获取对应的枚举案例。
此方法尝试根据提供的标量值查找并返回匹配的枚举案例。如果找不到匹配的案例,它将返回null。
<?php
enum Status: string
{
case OK = "OK";
case FAILED = "FAILED";
}
$statusOk = Status::tryFrom("OK"); // 返回 Status::OK
var_dump($statusOk);
$statusNotFound = Status::tryFrom("UNKNOWN"); // 返回 null
var_dump($statusNotFound);
enum ErrorCode: int
{
case SUCCESS = 0;
case NOT_FOUND = 404;
}
$errorCode = ErrorCode::tryFrom(404); // 返回 ErrorCode::NOT_FOUND
var_dump($errorCode);与tryFrom()类似,但如果找不到匹配的案例,from()方法会抛出一个ValueError异常。这适用于你确定输入值一定有效,或者希望显式捕获并处理错误的情况。
<?php
enum Status: string
{
case OK = "OK";
case FAILED = "FAILED";
}
try {
$statusOk = Status::from("OK"); // 返回 Status::OK
var_dump($statusOk);
$statusError = Status::from("INVALID"); // 抛出 ValueError
} catch (ValueError $e) {
echo "Error: " . $e->getMessage() . "\n";
}注意事项: tryFrom()和from()方法是针对支持值枚举的值进行匹配的,而不是案例名称。如果你的字符串是案例名称而不是值,这些方法将无法直接使用。
对于不带值的枚举,或者当你想通过枚举案例的名称(而不是值)来获取案例时,PHP没有提供原生的静态方法。在这种情况下,你需要实现一个自定义的静态辅助方法。
一个常见的实现方式是遍历枚举的所有案例(通过Enum::cases()方法),然后比较每个案例的->name属性与输入的字符串。
<?php
enum Status
{
case OK;
case FAILED;
case PENDING;
/**
* 根据字符串名称获取枚举案例。
*
* @param string $name 要查找的案例名称。
* @return self|null 如果找到匹配的案例则返回该案例,否则返回 null。
*/
public static function get(string $name): ?self
{
$name = strtoupper(trim($name)); // 规范化输入:去除空格,转为大写
if (empty($name)) {
return null;
}
foreach (self::cases() as $statusCase) {
if ($statusCase->name === $name) {
return $statusCase;
}
}
return null;
}
}
$statusOk = Status::get("OK"); // 返回 Status::OK
var_dump($statusOk);
$statusPending = Status::get("pending "); // 返回 Status::PENDING (处理了大小写和空格)
var_dump($statusPending);
$statusNotFound = Status::get("UNKNOWN"); // 返回 null
var_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::POST
var_dump($method);这个自定义的get方法提供了强大的灵活性,可以根据你的需求添加额外的逻辑,例如处理大小写不敏感的匹配、去除空格等。
从字符串获取PHP枚举案例的方法取决于枚举的类型以及你希望匹配的是案例的“值”还是“名称”。对于支持值枚举,tryFrom()和from()提供了高效的原生解决方案,通过匹配其关联的标量值来获取案例。然而,若要通过案例的字符串名称获取,尤其是不带值的枚举,则需要实现一个自定义的静态辅助方法,遍历所有案例并比较其->name属性。理解这些差异并选择合适的策略,将有助于你更有效地利用PHP枚举,编写出健壮且易于维护的代码。
以上就是PHP Enum:从字符串获取枚举案例的策略与实践的详细内容,更多请关注php中文网其它相关文章!
PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号