schleuse/php-enum

该软件包已被弃用且不再维护。作者建议使用myclabs/php-enum软件包。

PHP Enum实现

资助软件包维护!
mnapoli
Tidelift

1.8 2022-09-16 09:53 UTC

This package is auto-updated.

Last update: 2022-09-16 09:54:20 UTC


README

支持PHP 8.1的一些修复,同时保持与至少PHP 7.1的兼容性

从SplEnum启发的PHP Enum实现

Build Status Latest Stable Version Total Downloads psalm

该项目通过Tidelift支持维护。[链接](https://tidelift.com/subscription/pkg/packagist-myclabs-php-enum?utm_source=packagist-myclabs-php-enum&utm_medium=referral&utm_campaign=readme)

为什么?

首先,最主要的是,SplEnum并没有集成到PHP中,您需要单独安装扩展。

使用枚举而不是类常量有以下优点

  • 您可以将枚举用作参数类型:function setAction(Action $action) {
  • 您可以将枚举用作返回类型:function getAction() : Action {
  • 您可以在枚举中添加方法(例如formatparse等)
  • 您可以将枚举扩展以添加新值(使枚举final以防止其被扩展)
  • 您可以获取所有可能的值的列表(见下文)

此枚举类不是旨在替换类常量,而只是在有意义的时使用。

安装

composer require myclabs/php-enum

声明

use MyCLabs\Enum\Enum;

/**
 * Action enum
 */
class Action extends Enum
{
    private const VIEW = 'view';
    private const EDIT = 'edit';
}

使用

$action = Action::VIEW();

// or with a dynamic key:
$action = Action::$key();
// or with a dynamic value:
$action = new Action($value);

如您所见,静态方法会自动实现,以便快速访问枚举值。

与使用类常量相比的一个优点是可以将枚举用作参数类型

function setAction(Action $action) {
    // ...
}

文档

  • __construct() 构造函数检查值是否存在于枚举中
  • __toString() 您可以echo $myValue,它将显示枚举值(常量的值)
  • getValue() 返回枚举的当前值
  • getKey() 返回当前值在枚举上的键
  • equals() 测试枚举实例是否相等(如果枚举值相等,则返回true,否则返回false

静态方法

  • toArray() 方法返回所有可能的值作为数组(常量名作为键,常量值作为值)
  • keys() 返回枚举类中所有常量的名称(键)
  • values() 返回所有枚举常量的枚举类的实例(常量名作为键,枚举实例作为值)
  • isValid() 检查测试的值是否在枚举集中有效
  • isValidKey() 检查测试的键是否在枚举集中有效
  • search() 返回搜索值的键

静态方法

class Action extends Enum
{
    private const VIEW = 'view';
    private const EDIT = 'edit';
}

// Static method:
$action = Action::VIEW();
$action = Action::EDIT();

使用__callStatic()实现静态方法辅助器。

如果你关心IDE自动补全功能,你可以自己实现静态方法

class Action extends Enum
{
    private const VIEW = 'view';

    /**
     * @return Action
     */
    public static function VIEW() {
        return new Action(self::VIEW);
    }
}

或者你可以使用phpdoc(例如在PhpStorm中支持此功能)

/**
 * @method static Action VIEW()
 * @method static Action EDIT()
 */
class Action extends Enum
{
    private const VIEW = 'view';
    private const EDIT = 'edit';
}

相关项目