您好,登录后才能下订单哦!
小编给大家分享一下在PHP中如何创建枚举,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!
PHP 中的枚举
首先,我们将创建一个简单的颜色枚举,它将列出三种颜色:红色、蓝色和绿色。与其他语言一样,您可能知道我们会在我们的代码中引用这些颜色值,如 Color.Red、Color.Blue 和 Color.Green。我们不必创建某种类实例或任何东西。通常,语言将自己的枚举定义为语言语法的一部分和/或让您添加自己的枚举。另一方面,PHP 没有这个概念。所以我们必须做的是使用一个类,准确地说是一个抽象类,来做我们想做的事。对于我们的各种值,我们将定义一些常量。这是它的样子......
abstract class Color {
const RED = 1;
const BLUE = 2;
const GREEN = 3;
}
使用抽象类,我们不需要创建类的实例来访问它包含的变量。有了这个定义,我们可以开始使用我们的枚举类来比较值 1、2 和 3,分别是红色、蓝色和绿色。除了可读性之外,我们为什么要使用枚举?好吧,也许我们只能将颜色作为整数存储在数据库中。我们可以在数据库中存储 1,然后比较数据库中的值,看看它是否等于 Color.RED。如果没有这个枚举,我们可能不知道 1 是数据库中“红色”的表示。不只是在数据库中使用字符串听起来很愚蠢,但是您会惊讶为什么事情从来没有那么简单……尤其是在拥有数十名开发人员的大型组织中工作时。
如何使用
大多数熟悉枚举的人通常都知道使用句点来访问值。例如 Color.Blue 或 Color.Green。由于这是一个抽象类,并且 PHP 用于访问类成员的解析运算符是::
那么您将不得不使用Color::BLUE
和Color::GREEN
。还不错吧?
将枚举值转换为其键
正如一开始提到的,大多数时候你会使用一个枚举来比较你从其他地方得到的一些值和枚举的值。从数据库中获取值,将其与 Color.BLUE 进行比较,然后将页面颜色更改为蓝色作为响应。但是,如果我们有一个像 3 这样的值并且我们想知道枚举中的颜色呢?当然,我们可以针对我们定义的三个常量中的每一个尝试该值并得到我们的答案。但是如果我们不知道所有的常数值是多少呢?如果有 20 个常量呢?做 20 个 if/else 语句或设置一个包含 20 个 case 的 switch 会有点多。下面的代码采用了不同的方法。我们使用反射来获取常量,遍历它们并将每个常量的值与我们提供的值进行比较。如果没有找到,我们返回 null。
function getConstantName($enum, $constantValue) {
try {
$reflection = new ReflectionClass($enum);
} catch (ReflectionException $ex) {
return null;
}
$constants = $reflection->getConstants();
foreach ($constants as $key => $val) {
if ($val === $constantValue) {
return $key;
}
}
return null;
}
使用此代码,我们可以输入 Color 枚举名称和我们正在寻找的值,它将返回键。确保你给它一个枚举名称或我们类的实例,函数可以看到定义!例如,如果我们调用getConstantName('Color', 3);
将返回“绿色”。您可能会也可能不会决定使用此功能,但是如果您想知道 3 是否甚至等于我们的枚举“Color”中定义的颜色,那么您肯定可以使用它。如果你使用getConstantName('Color',
6); 你得到一个空值,并且知道它甚至不是受支持的颜色,并且可以将页面的颜色默认为Color::Red
。
未来的考虑
现在当然我知道你可能想用枚举做很多其他的事情。而且你甚至可以做一些事情,比如混合Color::BLUE
和Color::YELLOW
如果你希望它返回Color::GREEN
。由于我们创建了一个抽象类,因此将您的函数移动到类中并使其成为静态方法没有问题。如果您在网络上进行一些搜索,您会发现其他人提到了与此类似的想法,并将其转向其他方向,包括定义基类并从中继承。
以上是“在PHP中如何创建枚举”这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注亿速云行业资讯频道!
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。