litgroup/enumerable

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

PHP的可枚举类型实现。

v0.8.0 2021-01-30 20:25 UTC

This package is auto-updated.

Last update: 2023-10-29 01:29:17 UTC


README

库为PHP提供支持可枚举类的功能。

Version Dev Version Downloads License Build Status

  • 可枚举
    • 安装
    • 使用示例
      • 定义
      • 等式/身份检查
      • 在switch-case语句中的使用
      • 序列化和持久化
      • 可扩展性
    • 运行测试
    • LICENSE

安装

使用composer安装

composer require litgroup/enumerable:^0.8.0

使用示例

定义

  1. 创建一个扩展自 Enumerablefinal 类;
  2. 为每个值变体创建一个静态方法,该方法将创建一个值的实例。为此,您的方法必须调用 Enumerable::createEnum() 并传递值的某个索引。

注意

  • Enumerable 类必须是 final
  • 索引可以是 stringint 类型。

枚举定义示例

namespace Acme;

use LitGroup\Enumerable\Enumerable;

final class ColorEnum extends Enumerable
{
    /**
     * @return self
     */
    public static function red()
    {
        return self::createEnum('red');
    }

    /**
     * @return self
     */
    public static function green()
    {
        return self::createEnum('green');
    }

    /**
     * @return self
     */
    public static function blue()
    {
        return self::createEnum('blue');
    }
}

等式/身份检查

您可以在等式/身份表达式中使用可枚举值

ColorEnum::red() == ColorEnum::red() // => true
ColorEnum::red() === ColorEnum::red() // => true

ColorEnum::red() == ColorEnum::blue() // => false
ColorEnum::red() === ColorEnum::blue() // => false

注意:可枚举作为运行时常量工作。因此,可枚举值可以在 身份 上进行检查。我们建议尽可能使用身份检查(===)而不是等式检查(==)。

在switch-case语句中的使用

$color = ColorEnum::green();

switch ($color) {
    case ColorEnum::red():
        echo "Red!\n";
        break;
    case ColorEnum::green():
        echo "Green!\n";
        break;
    case ColorEnum::blue():
        echo "Blue!\n";
        break;
}

// "Green!" will be printed

序列化和持久化

Enumerable作为运行时常量。可枚举类型不能被序列化。如果您需要将可枚举类型的表示存储在数据库中或通过API发送,可以使用可枚举值的索引作为表示。

$enum->getRawValue();

要从数据库或API请求中通过索引恢复可枚举类型的实例,您可以在具体的枚举类上使用静态方法getValueOf()

$colorIndex = getFromDatabase(/* something */);

$enum = ColorEnum::getValueOf($colorIndex);

如果您需要获取可枚举类型的所有值,请在具体的枚举类上使用静态方法getValues()

ColorEnum::getValues(); // => Returns array of ColorEnum with index as key

可扩展性

如果需要,您的可枚举类的实例可以具有额外的行为。但是,您不能定义任何具有行为的public static方法。公共静态方法仅用于创建值。

注意:您不能定义任何具有行为的public static方法。公共静态方法仅用于创建值。

示例

final class MergeRequestStatus extends Enumerable {

    public static function open()
    {
        return self::createEnum('open');
    }

    public static function approved()
    {
        return self::createEnum('approved');
    }

    public static function merged()
    {
        return self::createEnum('merged');
    }

    public static function declined()
    {
        return self::createEnum('declined');
    }

    /**
     * Returns true if status is final.
     *
     * @return bool
     */
    public function isFinal()
    {
        return $this === self::merged() || $this === self::declined();
    }
}

运行测试

composer install
./tests.sh

许可证

请参阅LICENSE文件。