marc-mabe / enum-cl
PHP < 8.1 中枚举的仿真层和 PHP >= 8.1 的原生枚举
v1.0.0
2022-01-18 17:08 UTC
Requires
- php: ^7.1 | ^8.0
- composer-runtime-api: ^2.0
- ext-reflection: *
Requires (Dev)
- phpstan/phpstan: ^1.3.0
- phpunit/phpunit: ^7.5.20 | ^8.5.22 | ^9.5.11
- vimeo/psalm: ^4.17.0
This package is auto-updated.
Last update: 2024-09-18 22:47:15 UTC
README
如何创建
Vendor\MyEnum.php
<?php declare(strict_types=1); if (PHP_VERSION_ID < 80100) { require_once __DIR__ . '/MyEnum-emulated.php'; } else { require_once __DIR__ . '/MyEnum-native.php'; }
Vendor\MyEnum-emulated.php
<?php declare(strict_types=1); namespace Vendor; use Mabe\Enum\Cl\EmulatedIntEnum; final class MyEnum extends EmulatedIntEnum { protected const ZERO = 0; protected const ONE = 1; protected const TWO = 2; protected const THREE = 3; protected const FOUR = 4; protected const FIVE = 5; protected const SIX = 6; protected const SEVEN = 7; protected const EIGHT = 8; protected const NINE = 9; }
Vendor\MyEnum-native.php
<?php declare(strict_types=1); namespace Vendor; use Mabe\Enum\Cl\EnumBc; enum MyEnum:int { use EnumBc; case ZERO = 0; case ONE = 1; case TWO = 2; case THREE = 3; case FOUR = 4; case FIVE = 5; case SIX = 6; case SEVEN = 7; case EIGHT = 8; case NINE = 9; }
对于 IDE 和静态代码分析器,建议添加以下文档块
/** * @method static self CASENAME() */
如何使用
以下在 PHP<8.1(使用仿真枚举)和 PHP>=8.1(使用原生枚举)上都将表现相同
<?php declare(strict_types=1); namespace Vendor; use function Mabe\Enum\Cl\enum_exists; $zero = MyEnum::ZERO(); $zero = MyEnum::from(0); $zero = MyEnum::tryFrom(0); $cases = MyEnum::cases(); $zero->value; // 0 $zero->name; // ZERO $zero instanceof \UnitEnum; // true $zero instanceof \BackedEnum; // true MyEnum::ZERO() === MyEnum::from(0); // true MyEnum::from(0) === MyEnum::tryFrom(0); // true enum_exists(MyEnum::class); // true enum_exists('stdClass'); // false
警告:以下在某些 PHP 版本上可能不会表现相同
<?php declare(strict_types=1); namespace Vendor; MyEnum::ZERO; // PHP<8.1: Error: Cannot access protected const MyEnum::ZERO // PHP>=8.1: enum(MyEnum::ZERO) serialize(MyEnum::ZERO()); // PHP<8.1: Error: Trying to serialize a non serializable emulated enum case of MyEnum // PHP>=8.1: "E:11:"MyEnum:ZERO"
附加说明
PHPStan
默认情况下,PHPStan 会抱怨未使用常量,因为它不能自动检测在这种情况下通过反射的特殊使用。
为了避免这种情况,您需要在您的 phpstan.neon[.dist]
中添加以下内容
services:
-
class: Mabe\Enum\Cl\PHPStan\ConstantExtension
tags:
- phpstan.constants.alwaysUsedClassConstantsExtension
有关更多信息,请参阅 https://phpstan.org/developing-extensions/always-used-class-constants
包含的 Polyfills
此库包含以下 polyfills(如果尚未存在)
get_debug_type