fpoirotte/enum-trait

使用 traits 的 PHP 枚举类型

v0.1.4 2017-06-11 22:43 UTC

This package is auto-updated.

Last update: 2024-09-14 06:14:28 UTC


README

此组件为 PHP 提供实际的枚举类型。

安装

此组件依赖于 Composer 进行安装。

要在项目中使用 Enum Trait,只需添加对包的要求

$ php composer.php require fpoirotte/enum-trait

使用

使用以下片段来声明一个新的枚举

<?php

use \fpoirotte\EnumTrait;

final class FavoriteColor implements Serializable
{
    use EnumTrait;

    private $RED;
    private $BLUE;
    private $GREEN;
}

$red    = FavoriteColor::RED();
$red2   = FavoriteColor::RED();
$red3   = unserialize(serialize($red));
$red4   = clone $red;
$blue   = FavoriteColor::BLUE();

// Compare two distinct values
var_dump($red == $blue); // False

// Compare various instances of the same value
var_dump($red == $red2); // True
var_dump($red == $red3); // True
var_dump($red == $red4); // True

// Get the enum's value name
var_dump((string) $red); // "RED"

?>

目标

此组件旨在实现以下目标

  • 定义枚举的真正类型,以便它们可以作为类型提示使用

    <?php
    
    function displayUsingFavoriteColor(FavoriteColor $color, $message) {
        // ...
    }
    
    ?>
  • 使扩展现有枚举以添加新值成为可能。这通过类继承变得非常简单。通过 final 关键字防止扩展也很容易。

  • 消除实际值的需求。本质上,标签本身就应该足以确定特定枚举实例的含义。这也避免了重复。

    说再见吧以下惯例

    <?php
    
    class MyEnum extends SomeInferiorEnum
    {
        const VALUE1 = 'value1';
    }
    
    ?>
  • 将枚举值转换为不透明值。这实际上是上一个目标的结果。

    这阻止了开发人员直接使用值,例如 if ($enumValue == 1) { /* ... */ },这反过来又防止了底层值/类型演变时的细微错误。

  • 使直接比较枚举值成为可能,而无需辅助方法。请参见 使用 的示例。

  • 使轻松序列化/反序列化枚举成为可能(无需要求一些辅助函数)。

  • 使复制(克隆)枚举值成为可能,而无需特定的支持函数。

  • 不对附加 PHP 扩展(例如 SplTypes)提出要求。

贡献

要贡献补丁

许可

本项目采用 MIT 许可证发布。有关更多信息,请参阅 LICENSE 文件。