grifart/enum

提供具有行为的防弹枚举。

0.2.1 2019-12-10 15:36 UTC

This package is auto-updated.

Last update: 2024-09-13 13:25:43 UTC


README

枚举值对象。使用类型安全枚举值和行为。

仓库 gitlab.grifart.czgithub.com. pipeline status

grifart.com 赞助。

你喜欢视频 📺 而不是阅读吗?这里有英文的一个 和捷克语的一个

介绍

枚举代表预定义的值集。每个枚举类静态地定义了可用的值。每个值都通过该类的实例以轻量级方式表示。

  • 此枚举允许您为每个枚举值添加个别行为(类似于Java)。这允许您将您的switch/if转换为更易于阅读的组合。(见以下示例)
  • 检查枚举注解,如果phpdoc声明的类方法是否正确声明(当未指定或错误时将为您生成文档块)
  • 支持=====switch的使用
  • 支持字符串或整数标量键
  • 轻松访问枚举的标量值 DayOfWeek::MONDAY()->toScalar()(string) DayOfWeek::MONDAY()

还包括

  • 它是类型安全的。通过注释您的枚举类型,您可以保证不会有您未声明的其他值。function translateTo(DayOfWeek $day) { ...
  • 您可以获取所有可能的值的列表 Enum::getAvailableValues()

安装

composer require grifart/enum

此库使用语义版本控制 2.0。您可以在您的 composer.json 中安全地使用 ^ 约束。

要求

此库需要 PHP 7.1 及更高版本。

项目状态 & 发布流程

虽然此库仍在开发中,但它经过充分测试,应该足够稳定,可以用于生产环境。

当前版本号是 0.x.y。当引入非破坏性更改(添加新方法、优化现有代码等)时,y 增加。

当引入破坏性更改时,始终开始一个新的 0.x 版本周期。

因此,锁定项目到给定的发布周期,例如 0.1.*,是安全的。

如果您需要升级到较新的发布周期,请查看发布历史记录,以获取每个进一步的 0.x.0 版本引入的更改列表。

概述

静态方法

  • fromScalar() - 返回给定标量的枚举实例(值)
  • getAvailableValues() - 返回给定类型的所有值
  • provideInstances() - 实现,以返回枚举实例,或自动通过 Grifart\Enum\AutoInstances 特性实现。

实例方法

  • toScalar() - 返回标量值标识符
  • equals() - 如果传递了相同的枚举值,则返回 true
  • scalarEquals() - 如果传递的标量值等于当前值,则返回 true

最简单的枚举

/**
 * @method static DayOfWeek MONDAY()
 * @method static DayOfWeek TUESDAY()
 */
final class DayOfWeek extends \Grifart\Enum\Enum
{
    use Grifart\Enum\AutoInstances;
    private const MONDAY = 'monday';
    private const TUESDAY = 'tuesday';
}

$monday = DayOfWeek::MONDAY();
function process(DayOfWeek $day): void { /* ... */ }

具有行为的值

这样可以用组合代替条件。

本示例最初来源于忠诚度计划领域,继续查看完整代码示例及上下文

/**
 * @method static ExpirationType ASSIGNMENT()
 * @method static ExpirationType FIXED()
 */
abstract class ExpirationType extends \Grifart\Enum\Enum
{
	protected const ASSIGNMENT = 'assignment';
	protected const FIXED = 'fixed';

	abstract public function computeExpiration(Offer $offer): \DateTimeImmutable;

	protected static function provideInstances() : array {
		return [
			new class(self::ASSIGNMENT) extends ExpirationType {
				public function computeExpiration(Offer $offer): \DateTimeImmutable {
					return /* behaviour A */;
				}
			},
			new class(self::FIXED) extends ExpirationType {
				public function computeExpiration(Offer $offer): \DateTimeImmutable {
					return /* behaviour B */;
				}
			},
		];
	}
}

从类常量迁移[源代码]

本指南展示了如何通过几个简单步骤从具有常量的类迁移到\Grifart\Enum继续查看示例

为值添加行为[源代码]

本指南展示了如何逐步为枚举值添加行为。继续查看示例

复杂展示:订单生命周期跟踪[源代码]

本示例包含5种实现订单状态的方法。继续查看示例

衷心感谢

更多阅读