schleuse / php-enum
1.8
2022-09-16 09:53 UTC
Requires
- php: ^7.3 || ^8.0
- ext-json: *
Requires (Dev)
- phpunit/phpunit: ^7
- squizlabs/php_codesniffer: 1.*
- vimeo/psalm: ^3.8
Replaces
- myclabs/php-enum: 1.7.7
This package is auto-updated.
Last update: 2022-09-16 09:54:20 UTC
README
支持PHP 8.1的一些修复,同时保持与至少PHP 7.1的兼容性
从SplEnum启发的PHP Enum实现
该项目通过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 {
- 您可以在枚举中添加方法(例如
format
、parse
等) - 您可以将枚举扩展以添加新值(使枚举
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'; }