vcn/enum

此包已被弃用,不再维护。未建议替代包。

[已废弃] 具有模式匹配操作的枚举数据类型。由于 PHP 现在已有原生的枚举,因此此包已过时。

v1.5.2 2023-04-20 12:23 UTC

This package is auto-updated.

Last update: 2023-04-20 12:23:38 UTC


README

具有模式匹配操作的枚举数据类型。

快速入门

composer require vcn/enum

<?php

use Vcn\Lib\Enum;

/**
 * @method static Fruit APPLE()
 * @method static Fruit BANANA()
 */
class Fruit extends Enum
{
    protected const APPLE  = 0;
    protected const BANANA = 0;
}

Fruit::APPLE()->equals(Fruit::BANANA()); // false
Fruit::APPLE()->equals(Fruit::APPLE()); // true

Fruit::APPLE()
    ->when(Fruit::APPLE(), 'apple')
    ->when(Fruit::BANANA(), 'banana')
    ->get(); // 'apple'

动机

枚举(或枚举)是一种数据结构,用于描述一个值只能是预定义的一组不同值中的确切一个。

例如,我们可以将水果建模为以下内容(使用 ADTs),其中我们只考虑苹果和香蕉作为水果:

data Fruit = Apple | Banana

水果要么是苹果,要么是香蕉——不能两者都是,也不能两者都不是。

在这里,Fruit 是可枚举的类型,而 AppleBanana 是其标签(其可能的值或实例)。

此实现试图接近上述表达力的强大。

用法

data Fruit = Apple | Banana

要使用此实现表达上述内容,首先扩展 Enum 以定义 Fruit

<?php
 
final class Fruit extends Enum {}

(推荐将类声明为最终类,因为不支持进一步继承,将产生警告。)

然后定义标签为 Fruit 的常量成员

<?php

final class Fruit extends Enum {
    protected const APPLE  = 0;
    protected const BANANA = 0;
}

(常量值(0)没有意义,但由 PHP 要求。)

这将使标签作为魔法静态方法 Fruit::APPLE()Fruit::BANANA() 暴露出来。它们作为相应标签的构造函数。建议在 docblock 中将其标记为类成员

<?php

/**
 * @method static Fruit APPLE()
 * @method static Fruit BANANA()
 */
final class Fruit extends Enum {
    protected const APPLE  = 0;
    protected const BANANA = 0;
}

现在您可以实例化任一标签

<?php

$banana = Fruit::APPLE();
$apple  = Fruit::BANANA();

您可以测试相等性

<?php

Fruit::APPLE()->equals(Fruit::BANANA()); // false
Fruit::APPLE()->equals(Fruit::APPLE()); // true

您可以对标签进行模式匹配

<?php

Fruit::APPLE()
    ->when(Fruit::APPLE(), 'apple')
    ->when(Fruit::BANANA(), 'banana')
    ->get(); // 'apple'

您可以字符串化和反字符串化标签名称

<?php

Fruit::APPLE()->getName(); // 'APPLE'

Fruit::byName('APPLE'); // Fruit::APPLE()

您可以检查集合的完备性

<?php

Fruit::isExhaustive([Fruit::APPLE()]); // false

Fruit::isExhaustive([
    Fruit::APPLE(),
    Fruit::BANANA()
]); // true