PHP 枚举
1.2.2
2019-03-28 14:51 UTC
Requires
- php: ^7.1
- ext-json: *
Requires (Dev)
- larapack/dd: ^1.0
- phpunit/phpunit: ^7.0
README
本包是 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)。请参阅 许可证文件 了解更多信息。