当前位置: 首页 > 后端技术 > PHP

你如何处理PHP代码中的枚举类型Enum?

时间:2023-03-29 21:11:58 PHP

文章转自专业的Laravel开发者社区,原文链接:https://learnku.com/laravel/t...本文旨在让大家更好地理解什么是枚举,什么时候使用枚举以及如何在php.ini中使用它们我们在某些时候使用常量来定义我们代码中的一些常量值。它们被用来避免魔法值。通过用符号名称替换一些魔法值,我们可以赋予它一些意义。然后我们在代码中引用这个符号名称。由于我们一次定义它并多次使用它,因此以后搜索它并重命名或更改值会更容易。这就是为什么经常会看到类似于下面的代码的原因。key());//YES我们定义了一个继承自\Eloquent\Enumeration\AbstractEnumeration的新类YesNo。接下来我们定义一个常量来定义元素的名称,并创建一个代表这些元素的对象库。还有一些其他的事情我们需要记住,使用序列化/反序列化在其中创建自定义对象。我们可以在GitHub页面上找到更多示例和良好的文档。我们将展示的第二个库是zlikavac32/php-enum。与雄辩/枚举不同,这个库面向允许真正多态行为的抽象类。因此,我们可以使用each方法来定义一个枚举元素,而不是使用switch方法。通过使用严格的规则定义枚举,您还可以相当可靠地确保每个元素只有一个实例。该库面向抽象类,以便将每个成员的多个实例限制为一个。这个想法是每个枚举都必须定义为抽象的并枚举它的元素。请注意,您可以通过扩展类然后构造元素来滥用它,但如果这样做,这些将在代码审查期间被标记为红色。使用抽象类,我们知道我们不会意外地拥有枚举的新元素,因为它需要具体的实现。通过遵循将这些具体实现保留在枚举本身中的规则,我们可以很容易地发现滥用。匿名类在这里很有用。该库强制执行抽象枚举类,但不创建有效元素。这是本图书馆用户的责任。图书馆负责其余的工作。让我们看一个简单的例子。name());//YESPHPDoc注释定义了返回枚举元素的现有静态方法。这有助于搜索和重构代码。接下来,我们将枚举YesNo定义为抽象并扩展\Zlikavac32\Enum\Enum并定义一个静态方法enumerate。然后,在enumerate方法中,我们列出将用于表示它们的元素名称。刚才我们提到了多态行为,那么我们为什么要使用它呢?当我们试图限制同一枚举元素的多个实例时发生的一件事是我们不能有循环引用。假设我们想要一个由NORTH、SOUTH、EAST和WEST组成的WorldSide枚举。我们还希望有一个方法opposite():WorldSide返回代表对立面的元素。如果我们尝试通过构造函数注入相反的元素,在某些时候,我们会得到一个循环引用,这意味着,我们需要同一元素的第二个实例。要返回一个有效的逆世界,我们必须破解代理对象或switch语句。使用多态行为,我们所能做的就是让我们看到我们可以定义我们需要的WorldSide枚举。newclassextendsWorldSide{publicfunctionopposite():WorldSide{returnWorldSide::SOUTH();}},'SOUTH'=>newclassextendsWorldSide{publicfunctionopposite():WorldSide{returnWorldSide::NORTH();}},'EAST'=>newclassextendsWorldSide{publicfunctionopposite():WorldSide{returnWorldSide::WEST();}},'WEST'=>newclassextendsWorldSide{publicfunctionopposite():WorldSide{returnWorldSide::EAST();}}];}abstractpublicfunctionopposite():WorldSide;}foreach(WorldSide::iterator()as$worldSide){var_dump(sprintf('%s的对面是%s',(string)$worldSide,(string)$worldSide->opposite()));}在enumerate方法中,我们为每个由枚举元素名称索引的枚举元素提供一个实现数组。手动创建元素时,我们将元素名称定义为数据键。我们可以使用WorldSide::iterator()来获取枚举元素的顺序迭代器,以定义和迭代它们。每个枚举元素都有一个默认的__toString():返回元素名称的字符串实现。每个枚举元素返回其相反的元素。回顾一下,常量不是枚举,枚举也不是常量。每个枚举定义一个类型。如果我们有一些常量,其值对我们很重要但名称不重要,我们应该坚持使用常量。如果我们有一些常量,其值对我们来说无关紧要,但与同一组中的其他人不同很重要,请使用枚举Enums为代码提供更多上下文,还可以将某些检查委托给引擎本身。如果PHP具有本机枚举支持,那就太好了。语法更改可以使代码更具可读性。该引擎可以为我们执行检查并执行一些无法从用户空间执行的规则。你如何使用枚举,你对这个问题有什么看法?请在下方评论