marc-mabe/enum-cl

PHP < 8.1 中枚举的仿真层和 PHP >= 8.1 的原生枚举

v1.0.0 2022-01-18 17:08 UTC

This package is auto-updated.

Last update: 2024-09-18 22:47:15 UTC


README

Build Status Code Coverage

如何创建

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