markbaker/enumhelper

一个小型库,为PHP 8.1的枚举提供辅助特性

1.0.2 2022-01-20 16:56 UTC

This package is auto-updated.

Last update: 2024-09-20 23:39:02 UTC


README

Build Status Total Downloads Latest Stable Version License

此包提供了一系列特性,允许您

  • RestorableFromName 特性

    从名称字符串创建/恢复PHP 8.1枚举。

  • EnumValidatableCase

    验证从名称字符串的枚举名称。

  • CasesIndexedByName

    类似于标准的静态cases()方法,但返回一个关联数组,按名称索引。

安装

您可以通过composer安装此包

composer require markbaker/enumhelper

使用方法

RestorableFromName 特性

在PHP 8.1中,您可以使用枚举的from()tryFrom()方法从值创建一个枚举。

enum Suit: string {
    case Hearts = 'H';
    case Diamonds = 'D';
    case Clubs = 'C';
    case Spades = 'S';
}

$suit = Suit::Diamonds;

$value = $suit->value;      // Returns 'D' 

$newSuit = Suit::from($value);

此库中提供的EnumHelper\EnumRestorableFromName特性为任何枚举添加了一个fromName()方法,您可以从名称而不是值创建枚举。

enum Suit: string {
    use EnumHelper\EnumRestorableFromName;

    case Hearts = 'H';
    case Diamonds = 'D';
    case Clubs = 'C';
    case Spades = 'S';
}

$suit = Suit::Diamonds;

$suitName = $suit->name;      // Returns 'Diamonds' 

$newSuit = Suit::fromName($suitName);

无效的名称将抛出异常。注意名称是区分大小写的。

如果您希望将名称存储在数据库中以供阅读(尤其是对于未支持的枚举),然后在加载数据库记录时在模型中重新创建枚举,这可能会很有用。

这与支持和不支持的枚举都兼容。

EnumValidatableCase 特性

用于验证枚举的案例集中是否已定义名称

enum Suit: string {
    use EnumHelper\EnumValidatableCase;

    case Hearts = 'H';
    case Diamonds = 'D';
    case Clubs = 'C';
    case Spades = 'S';
}

$suit = Suit::Diamonds;

$validCaseName = Suit::Hearts;
$isCaseNameValid = Suit::isValidCase($validCaseName);      // Returns boolean true

$invalidCaseName = 'HeArTs';
$isCaseNameValid = Suit::isValidCase($invalidCaseName);    // Returns boolean false

注意名称是区分大小写的。

这与支持和不支持的枚举都兼容。

CasesIndexedByName 特性

虽然PHP 8.1+的枚举已经提供了标准的静态cases()方法,用于返回为该枚举定义的所有案例的列表

enum Suit: string {
    use EnumHelper\EnumValidatableCase;

    case Hearts = 'H';
    case Diamonds = 'D';
    case Clubs = 'C';
    case Spades = 'S';
}

var_dump(Suit::cases());

它返回一个定义的案例的枚举数组。

array(4) {
  [0]=>
  enum(Suit::Hearts)
  [1]=>
  enum(Suit::Diamonds)
  [2]=>
  enum(Suit::Clubs)
  [3]=>
  enum(Suit::Spades)
}

使用CasesIndexedByName特性和相关的casesIndexedByName()方法

enum Suit: string {
    use EnumHelper\CasesIndexedByName;

    case Hearts = 'H';
    case Diamonds = 'D';
    case Clubs = 'C';
    case Spades = 'S';
}

var_dump(Suit::casesIndexedByName());

它将返回一个关联数组,其中定义的案例作为数组索引。

array(4) {
  ["Hearts"]=>
  enum(Suit::Hearts)
  ["Diamonds"]=>
  enum(Suit::Diamonds)
  ["Clubs"]=>
  enum(Suit::Clubs)
  ["Spades"]=>
  enum(Suit::Spades)
}

如果您要过滤cases()列表以返回案例的子集,并且不喜欢枚举数组中数字序列的间隔,这可能会特别有用。

enum Suit: string {
    use EnumHelper\CasesIndexedByName;

    public const RED = 'Red';
    public const BLACK = 'Black';

    case Hearts = 'H';
    case Diamonds = 'D';
    case Clubs = 'C';
    case Spades = 'S';

    public function color(): string {
        return match($this) {
            self::Hearts, self::Diamonds => self::RED,
            self::Clubs, self::Spades => self::BLACK,
        };
    }

    public static function red(): array {
        return array_filter(
            self::casesIndexedByName(),
            fn(self $suit) => $suit->color() === self::RED
        );
    }

    public static function black(): array {
        return array_filter(
            self::casesIndexedByName(),
            fn(self $suit) => $suit->color() === self::BLACK
        );
    }
}

var_dump(Suit::black());

将返回

array(2) {
  ["Clubs"]=>
  enum(Suit::Clubs)
  ["Spades"]=>
  enum(Suit::Spades)
}

变更日志

有关最近更改的更多信息,请参阅变更日志

许可证

此库在MIT许可证(MIT)下发布。有关更多信息,请参阅许可证文件