在PHP中怎么创建枚举?php创建枚举的方法分享!

2021-09-16 10:56:46 浏览数 (2538)

如果您熟悉任何主要编程语言(.NET、Java、Python 等),您可能熟悉“枚举”或“枚举”的概念。这些用于通过将可读名称分配给静态值集合来帮助提高可读性。阅读“Color.Red”比查看“#FF0000”或“1”要容易得多。为了扩展这个想法,想象写一个 if 语句,你将一个十六进制值与红色进行比较​if ("#FF0000" == Color.Red) { // Do stuff }​似乎更有意义并且直截了当。或者,您可能正在将一个值与 switch 语句中的多个情况进行比较。比较 "#FF0000" 与 Color.Red、Color.Blue 和 Color.Green 比 "#FF0000"、"#00FF00" 更容易
如果您熟悉枚举和 PHP,您可能会说“在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​。由于我们创建了一个抽象类,因此将您的函数移动到类中并使其成为静态方法没有问题。如果您在网络上进行一些搜索,您会发现其他人提到了与此类似的想法,并将其转向其他方向,包括定义基类并从中继承。