myclabs / php-enum
PHP 枚举实现
1.8.4
2022-08-04 09:53 UTC
Requires
- php: ^7.3 || ^8.0
- ext-json: *
Requires (Dev)
- phpunit/phpunit: ^9.5
- squizlabs/php_codesniffer: 1.*
- vimeo/psalm: ^4.6.2
README
本项目维护通过 Tidelift 支持,详情请见 此处。
为什么?
首先,主要原因是 SplEnum
并没有集成到 PHP 中,您需要单独安装扩展。
使用枚举代替类常量有以下优点:
- 您可以将枚举用作参数类型:
function setAction(Action $action) {
- 您可以将枚举用作返回类型:
function getAction() : Action {
- 您可以为枚举添加方法(例如
format
,parse
等) - 您可以将枚举扩展以添加新值(使枚举
final
以防止扩展) - 您可以获取所有可能值的列表(见下文)
此 Enum 类不打算替代类常量,而仅当有此需要时使用。
安装
composer require myclabs/php-enum
声明
use MyCLabs\Enum\Enum; /** * Action enum * * @extends Enum<Action::*> */ final 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 = Action::from($value); // or $action = new Action($value);
如您所见,静态方法自动实现以提供对枚举值的快速访问。
使用枚举作为参数类型的一个优点是
function setAction(Action $action) { // ... }
文档
__construct()
构造函数检查值是否存在于枚举中__toString()
您可以使用echo $myValue
,它将显示枚举值(常量的值)getValue()
返回枚举的当前值getKey()
返回枚举当前值的键equals()
测试枚举实例是否相等(如果枚举值相等则返回true
,否则返回false
)
静态方法
from()
创建枚举实例,检查值是否存在于枚举中toArray()
方法返回所有可能值作为数组(键为常量名,值为常量值)keys()
返回 Enum 类中所有常量的名称(键)values()
返回所有 Enum 常量的 Enum 类实例(键为常量名,值为 Enum 实例)isValid()
检查测试值是否在枚举集中有效isValidKey()
检查测试键是否在枚举集中有效assertValidValue()
断言值在枚举集中有效,否则抛出异常search()
返回搜索值的键
静态方法
final class Action extends Enum { private const VIEW = 'view'; private const EDIT = 'edit'; } // Static method: $action = Action::VIEW(); $action = Action::EDIT();
使用 __callStatic()
实现了静态方法辅助器。
如果您关心 IDE 自动补全,您可以自己实现静态方法
final 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() */ final class Action extends Enum { private const VIEW = 'view'; private const EDIT = 'edit'; }
本地枚举和迁移
本地枚举在 PHP 8.1 中出现: https://php.ac.cn/enumerations
如果您的项目运行在 PHP 8.1+ 或您的库将其作为最低要求,您应使用它而不是此库。
如果从 myclabs/php-enum
迁移,如果使用方式正确,则所需的努力应该很小
- 私有常量
- 最终类
- 没有方法被覆盖
迁移更改
- 类定义应从
/** * @method static Action VIEW() * @method static Action EDIT() */ final class Action extends Enum { private const VIEW = 'view'; private const EDIT = 'edit'; }
更改为
enum Action: string { case VIEW = 'view'; case EDIT = 'edit'; }
所有将类用作类型的所有地方将继续工作。
用法和所需更改