myclabs/php-enum

PHP 枚举实现

资助包维护!
mnapoli
Tidelift

安装次数: 181,373,053

依赖者: 728

建议者: 4

安全: 0

星标: 2,720

关注者: 32

分支: 132

开放问题: 14

1.8.4 2022-08-04 09:53 UTC

README

GitHub Actions Latest Stable Version Total Downloads Psalm Shepherd

本项目维护通过 Tidelift 支持,详情请见 此处

为什么?

首先,主要原因是 SplEnum 并没有集成到 PHP 中,您需要单独安装扩展。

使用枚举代替类常量有以下优点:

  • 您可以将枚举用作参数类型: function setAction(Action $action) {
  • 您可以将枚举用作返回类型: function getAction() : Action {
  • 您可以为枚举添加方法(例如 formatparse 等)
  • 您可以将枚举扩展以添加新值(使枚举 final 以防止扩展)
  • 您可以获取所有可能值的列表(见下文)

此 Enum 类不打算替代类常量,而仅当有此需要时使用。

安装

composer require myclabs/php-enum

声明

use MyCLabs\Enum\Enum;

/**
 * Action enum
 *
 * @extends Enum<Action::*>
 */
final class Action extends Enum
{
    private const VIEW = 'view';
    private const EDIT = 'edit';
}

使用

$action = Action::VIEW();

// or with a dynamic key:
$action = Action::$key();
// or with a dynamic value:
$action = Action::from($value);
// or
$action = new Action($value);

如您所见,静态方法自动实现以提供对枚举值的快速访问。

使用枚举作为参数类型的一个优点是

function setAction(Action $action) {
    // ...
}

文档

  • __construct() 构造函数检查值是否存在于枚举中
  • __toString() 您可以使用 echo $myValue,它将显示枚举值(常量的值)
  • getValue() 返回枚举的当前值
  • getKey() 返回枚举当前值的键
  • equals() 测试枚举实例是否相等(如果枚举值相等则返回 true,否则返回 false

静态方法

  • from() 创建枚举实例,检查值是否存在于枚举中
  • toArray() 方法返回所有可能值作为数组(键为常量名,值为常量值)
  • keys() 返回 Enum 类中所有常量的名称(键)
  • values() 返回所有 Enum 常量的 Enum 类实例(键为常量名,值为 Enum 实例)
  • isValid() 检查测试值是否在枚举集中有效
  • isValidKey() 检查测试键是否在枚举集中有效
  • assertValidValue() 断言值在枚举集中有效,否则抛出异常
  • search() 返回搜索值的键

静态方法

final class Action extends Enum
{
    private const VIEW = 'view';
    private const EDIT = 'edit';
}

// Static method:
$action = Action::VIEW();
$action = Action::EDIT();

使用 __callStatic() 实现了静态方法辅助器。

如果您关心 IDE 自动补全,您可以自己实现静态方法

final class Action extends Enum
{
    private const VIEW = 'view';

    /**
     * @return Action
     */
    public static function VIEW() {
        return new Action(self::VIEW);
    }
}

或者您可以使用 phpdoc(例如在 PhpStorm 中受支持)

/**
 * @method static Action VIEW()
 * @method static Action EDIT()
 */
final class Action extends Enum
{
    private const VIEW = 'view';
    private const EDIT = 'edit';
}

本地枚举和迁移

本地枚举在 PHP 8.1 中出现: https://php.ac.cn/enumerations
如果您的项目运行在 PHP 8.1+ 或您的库将其作为最低要求,您应使用它而不是此库。

如果从 myclabs/php-enum 迁移,如果使用方式正确,则所需的努力应该很小

  • 私有常量
  • 最终类
  • 没有方法被覆盖

迁移更改

  • 类定义应从
/**
 * @method static Action VIEW()
 * @method static Action EDIT()
 */
final class Action extends Enum
{
    private const VIEW = 'view';
    private const EDIT = 'edit';
}

更改为

enum Action: string
{
    case VIEW = 'view';
    case EDIT = 'edit';
}

所有将类用作类型的所有地方将继续工作。

用法和所需更改

相关项目