该项目的维护由 Tidelift 提供支持。
首先,主要是, SplEnum没有集成到 PHP 中,您必须单独安装扩展。
使用枚举代替类常量具有以下优点:
您可以使用枚举作为参数类型: function setAction(Action $action) {
您可以使用枚举作为返回类型: function getAction() : Action {
您可以使用方法来丰富枚举(例如format 、 parse等)
您可以扩展枚举以添加新值(使您的枚举final以防止它)
您可以获得所有可能值的列表(见下文)
这个 Enum 类并不是要取代类常量,而是仅在有意义时使用。
composer require myclabs/php-enum
use MyCLabsEnumEnum;/** * Action 枚举 * * @extends Enum<Action::*> */final class Action extends Enum
{private const VIEW = '查看';private const EDIT = '编辑';
}$action = Action::VIEW();// 或使用动态键:$action = Action::$key();// 或使用动态值:$action = Action::from($value);/ / 或$action = new Action($value);
如您所见,静态方法会自动实现以提供对枚举值的快速访问。
与使用类常量相比,一个优点是能够使用枚举作为参数类型:
函数 setAction(Action $action) {// ...}__construct()构造函数检查枚举中是否存在该值
__toString()您可以echo $myValue ,它将显示枚举值(常量的值)
getValue()返回枚举的当前值
getKey()返回 Enum 上当前值的键
equals()测试枚举实例是否相等(如果枚举值相等则返回true ,否则false )
静态方法:
from()创建一个 Enum 实例,检查该值是否存在于枚举中
toArray()方法 以数组形式返回所有可能的值(键中的常量名称,值中的常量值)
keys()返回 Enum 类中所有常量的名称(键)
values()返回所有 Enum 常量的 Enum 类实例(键中的常量名称,值中的 Enum 实例)
isValid()检查测试值在枚举集上是否有效
isValidKey()检查测试的密钥在枚举集上是否有效
assertValidValue()断言该值在枚举集上有效,否则抛出异常
search()返回搜索值的键
最终类 Action 扩展了 Enum
{private const VIEW = '查看';private const EDIT = '编辑';
}// 静态方法:$action = Action::VIEW();$action = Action::EDIT();静态方法助手是使用__callStatic()实现的。
如果您关心 IDE 自动完成,您可以自己实现静态方法:
最终类 Action 扩展了 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() */final class Action extends Enum
{private const VIEW = '查看';private const EDIT = '编辑';
}PHP 8.1 版本中引入了原生枚举:https://www.php.net/enumerations
如果您的项目运行 PHP 8.1+ 或者您的库将其作为最低要求,您应该使用它而不是此库。
从myclabs/php-enum迁移时,如果按照推荐的方式使用,那么工作量应该很小:
私有常量
最后的课程
没有方法被重写
迁移的变化:
类定义应从
/** * @method static Action VIEW() * @method static Action EDIT() */final class Action extends Enum
{private const VIEW = '查看';private const EDIT = '编辑';
}到
枚举操作: string{case VIEW = 'view';case EDIT = 'edit';
}所有使用类作为类型的地方都将继续工作。
用法和所需的更改:
| 手术 | myclabs/php-enum | 本机枚举 |
|---|---|---|
| 获取实例将从 | $enumCase = Action::VIEW() | $enumCase = Action::VIEW |
| 从支持值创建枚举 | $enumCase = new Action('view') | $enumCase = Action::from('view') |
| 获取枚举实例的支持值 | $enumCase->getValue() | $enumCase->value |
| 比较两个枚举实例 | $enumCase1 == $enumCase2或者 $enumCase1->equals($enumCase2) | $enumCase1 === $enumCase2 |
| 获取枚举实例的键/名称 | $enumCase->getKey() | $enumCase->name |
| 获取枚举所有可能实例的列表 | Action::values() | Action::cases() |
| 获取按名称映射的枚举的可能实例的映射 | Action::values() | array_combine(array_map(fn($case) => $case->name, Action::cases()), Action::cases())或者 (new ReflectionEnum(Action::class))->getConstants() |
| 获取枚举所有可能名称的列表 | Action::keys() | array_map(fn($case) => $case->name, Action::cases()) |
| 获取枚举所有可能支持值的列表 | Action::toArray() | array_map(fn($case) => $case->value, Action::cases()) |
| 获取按名称映射的枚举的可能支持值的映射 | Action::toArray() | array_combine(array_map(fn($case) => $case->name, Action::cases()), array_map(fn($case) => $case->value, Action::cases()))或者 array_map(fn($case) => $case->value, (new ReflectionEnum(Action::class))->getConstants())) |
PHP 8.1+ 本机枚举
学说枚举映射
Symfony ParamConverter 集成
PHPStan 集成