该项目的维护由 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 集成