PHP 枚举

1.2.2 2019-03-28 14:51 UTC

This package is auto-updated.

Last update: 2024-08-29 02:51:52 UTC


README

Latest Version on Packagist Build Status Total Downloads

本包是 Spatie/Enum 的分支,以支持 PHP 7.1。

此包提供PHP的强类型枚举。我们不使用简单的"值"表示,因此你总是使用枚举对象。这允许在IDE中进行正确的自动完成和重构。

以下是使用此包创建枚举的方式

/**
 * @method static self draft()
 * @method static self published()
 * @method static self archived()
 */
class StatusEnum extends Enum
{
}

以下是它们的用法

public function setStatus(StatusEnum $status): void
{
    $this->status = $status;
}

// …

$class->setStatus(StatusEnum::draft());

安装

您可以通过composer安装此包

composer require fatturaelettronicaphp/enum

用法

这是枚举的定义方式。

/**
 * @method static self draft()
 * @method static self published()
 * @method static self archived()
 */
class StatusEnum extends Enum
{
}

以下是它们的用法

public function setStatus(StatusEnum $status)
{
    $this->status = $status;
}

// …

$class->setStatus(StatusEnum::draft());

从值创建枚举

$status = StatusEnum::from('draft');

// or

$status = new StatusEnum('published');

覆盖枚举值

默认情况下,枚举的字符串值简单地是该方法的名称。在上一个例子中将是 draft

您可以通过添加 $map 属性来覆盖此值

/**
 * @method static self draft()
 * @method static self published()
 * @method static self archived()
 */
class StatusEnum extends Enum
{
    protected static $map = [
        'draft' => '1',
        'published' => 'other published value',
        'archived' => '-10',
    ];
}

映射值是可选的。

请注意,映射的值始终应该是字符串。

比较枚举

可以使用 equals 方法比较枚举

$status->equals($otherStatus);

您也可以使用动态 is 方法

$status->isDraft(); // return a boolean

请注意,如果您想要这些 is 方法的自动完成,必须在您的枚举类上添加额外的文档块。

枚举特定方法

可能存在一种情况,您希望功能取决于具体的枚举值。

有几种方法可以实现这一点

  • 在枚举类中添加一个函数,并使用switch语句或数组映射。
  • 使用一个包含此切换逻辑的单独类,类似于C#中的枚举扩展。
  • 使用枚举特定方法,类似于Java。

此包也支持这些枚举特定方法。以下是它们的实现方式

abstract class MonthEnum extends Enum
{
    abstract public function getNumericIndex(): int;

    public static function january(): MonthEnum
    {
        return new class() extends MonthEnum
        {
            public function getNumericIndex(): int
            {
                return 1;
            }
        };
    }

    public static function february(): MonthEnum
    {
        return new class() extends MonthEnum
        {
            public function getNumericIndex(): int
            {
                return 2;
            }
        };
    }
    
    // …
}

通过将枚举类本身声明为抽象的,并使用静态构造函数而不是文档注释,您可以为每个枚举返回一个匿名类,每个类都实现所需的方法。

您可以像使用任何其他枚举一样使用这个枚举

MonthEnum::january()->getNumericIndex()

请注意,这种方法的一个缺点是枚举的值 始终 是静态函数的名称,没有方法可以将其映射。

测试

composer test

变更日志

请参阅 CHANGELOG 了解最近的变化。

贡献

请参阅 CONTRIBUTING 了解详细信息。

安全

如果您发现任何与安全相关的问题,请通过电子邮件 daniele@weble.it 联系,而不是使用问题跟踪器。

鸣谢

许可证

MIT许可证(MIT)。请参阅 许可证文件 了解更多信息。