vcn / enum
此包已被弃用,不再维护。未建议替代包。
[已废弃] 具有模式匹配操作的枚举数据类型。由于 PHP 现在已有原生的枚举,因此此包已过时。
v1.5.2
2023-04-20 12:23 UTC
Requires
- php: ^8.0
- ext-json: *
Requires (Dev)
- phpstan/phpstan: ^1.4
- phpunit/phpunit: ^9.5
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
是可枚举的类型,而 Apple
和 Banana
是其标签(其可能的值或实例)。
此实现试图接近上述表达力的强大。
用法
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