epalshin / enum
强大的PHP枚举库
2.0.0
2021-06-06 09:33 UTC
Requires
- php: ^8.0
- ext-json: *
Requires (Dev)
- friendsofphp/php-cs-fixer: ^3.0
- phpunit/phpunit: ^9.5
- spatie/ray: ^1.10
- vimeo/psalm: ^4.3
README
此包为PHP提供强类型枚举,具有一些独特特性。
快速功能示例
use Palshin\Enum\Enum; /** * @method static self CLIENT() = 1 * @method static self ADMIN() * @method static self MANAGER() */ final class UserRole extends Enum { } UserRole::MANAGER() instanceof UserRole; // true UserRole::MANAGER() === UserRole::MANAGER(); // true UserRole::MANAGER()->value; // 3 UserRole::all(); // [ UserRole::CLIENT(), UserRole::ADMIN(), UserRole::MANAGER() ] UserRole::toArray(); // [ 'CLIENT' => 1, 'ADMIN' => 2, 'MANAGER' => 3 ] UserRole::toValues(); // [1, 2, 3] UserRole::toNames(); // ['CLIENT', 'ADMIN', 'MANAGER'] UserRole::CLIENT()->id(); // FQCN with enum member name: App\Enums\UserRole::CLIENT echo UserRole::CLIENT(); // print "1" echo json_encode(['enumMember' => UserRole::CLIENT()]); // print "{enumMember:1}"
安装
使用Composer安装包
composer require epalshin/enum
用法
您可以选择三种方式之一来定义枚举成员(或其组合)。
PHPDoc注释
use Palshin\Enum\Enum; /** * @method static self CLIENT() = 1 * @method static self ADMIN() * @method static self MANAGER() */ final class UserRole extends Enum { }
类常量
use Palshin\Enum\Enum; final class UserRole extends Enum { private const CLIENT = 1; private const ADMIN = 2; private const MANAGER = 3; }
静态方法
use Palshin\Enum\Enum; final class UserRole extends Enum { public static function values(): array { return [ 'CLIENT' => 1, 'ADMIN' => 2, 'MANAGER' => 3, ]; } }
您也可以在声明中组合几种(甚至全部)方法
use Palshin\Enum\Enum; /** * @method static self CLIENT() */ final class UserRole extends Enum { private const ADMIN = 2; public static function values(): array { return [ 'MANAGER' => 3, ]; } }
❗ 如果您决定组合声明枚举成员的方式,请注意成员的交集:枚举成员的名称对枚举类来说是唯一的,因此同一成员的不同值可能导致代码中出现不明显的错误。名称的优先级顺序是:常量声明、功能声明和PHPDoc注释声明。名称区分大小写。
我个人更喜欢使用PHPDoc注释的方式,但如果你想在没有类封装的情况下保持对枚举值的访问并获取IDE的自动补全功能,你可以这样做
use Palshin\Enum\Enum; /** * @method static self CLIENT() * @method static self ADMIN() * @method static self MANAGER() */ final class UserRole extends Enum { const CLIENT = 1; const ADMIN = 2; const MANAGER = 3; } UserRole::CLIENT === 1; // true UserRole::CLIENT() instanceof UserRole; // true
在某些情况下,可能需要在枚举类中添加元信息。您可以这样做
use Palshin\Enum\Enum; /** * @method static self CLIENT() * @method static self MANAGER() * @method static self ADMIN() */ class UserRole extends Enum { public static function labels(): array { return [ 'CLIENT' => 'Client account', 'MANAGER' => 'Manager account', 'ADMIN' => 'Administrator account' ]; } public static function descriptions(): array { return [ 'CLIENT' => 'Online store buyer', 'MANAGER' => 'The person who is responsible for interaction with the client', 'ADMIN' => 'The person who controls the managers' ]; } } UserRole::CLIENT()->label; // Client account UserRole::MANAGER()->description; // The person who is responsible for interaction with the client