vicgutt/php-enhanced-enum

增强PHP原生枚举的便利方法

v0.1.0 2022-11-05 16:24 UTC

This package is auto-updated.

Last update: 2024-09-15 13:13:10 UTC


README

GitHub Tests Action Status GitHub PHPStan Action Status GitHub Code Style Action Status Latest Version on Packagist Total Downloads

此包提供便利的单用途特性和接口,旨在独立增强原生PHP枚举。

提供的特性包括

提供的接口包括

注意Enumerable 特性是所有可用特性的组合,同样,EnumerableContract 接口扩展了所有其他接口。

安装

您可以通过composer安装此包

composer require vicgutt/php-enhanced-enum

用法

由于该包仅提供特性和接口以增强枚举,因此您需要为每个枚举使用给定的特性/接口对。

示例

use VicGutt\PhpEnhancedEnum\Concerns\Enumerable;
use VicGutt\PhpEnhancedEnum\Contracts\EnumerableContract;

enum MyEnum: string implements EnumerableContract
{
    use Enumerable;
    
    case CASE1 = 'case1';
    case CASE2 = 'case2';
}

从那里,您可以使用提供的任何附加方法。

特性和接口以及可用方法

在本文档中,我们将使用以下示例枚举

use VicGutt\PhpEnhancedEnum\Concerns\Enumerable;
use VicGutt\PhpEnhancedEnum\Contracts\EnumerableContract;

/**
 * A "unit enum"
 */
enum MovementsEnum implements EnumerableContract
{
    use Enumerable;

    case ME_TOO;
    case BLACK_LIVES_MATTER;
    case LGBTQ_PLUS;
    case AND_MANY_MANY_MORE;
}

/**
 * An integer typed "backed enum"
 */
enum PromiseEnum: int implements EnumerableContract
{
    use Enumerable;

    case PENDING = 1;
    case RESOLVED = 2;
    case REJECTED = 3;
}

/**
 * A string typed "backed enum"
 */
enum StatusEnum: string implements EnumerableContract
{
    use Enumerable;

    case PENDING = 'pending';
    case SUCCEEDED = 'succeeded';
    case FAILED = 'failed';
}

注意: 上述示例枚举可以选择单独使用一个、所有或任何提供的特性和接口。

HasKeys

检索枚举的案例名称。

示例

MovementsEnum::keys(); // ['ME_TOO', 'BLACK_LIVES_MATTER', 'LGBTQ_PLUS', 'AND_MANY_MANY_MORE']
PromiseEnum::keys(); // ['PENDING', 'RESOLVED', 'REJECTED']
StatusEnum::keys(); // ['PENDING', 'SUCCEEDED', 'FAILED']

HasValues

检索枚举的案例值。

示例

MovementsEnum::values(); // ['ME_TOO', 'BLACK_LIVES_MATTER', 'LGBTQ_PLUS', 'AND_MANY_MANY_MORE']
PromiseEnum::values(); // [1, 2, 3]
StatusEnum::values(); // ['pending', 'succeeded', 'failed']

注意: 对于“单位枚举”,由于它们在技术上没有值,HasValues 特性将使用枚举的键作为值。因此,值始终与键相同。

HasEntries

检索枚举的键和值。

示例

MovementsEnum::entries(); // ['ME_TOO' => 'ME_TOO', 'BLACK_LIVES_MATTER' => 'BLACK_LIVES_MATTER', 'LGBTQ_PLUS' => 'LGBTQ_PLUS', 'AND_MANY_MANY_MORE' => 'AND_MANY_MANY_MORE']
PromiseEnum::entries(); // ['PENDING' => 1, 'RESOLVED' => 2, 'REJECTED' => 3]
StatusEnum::entries(); // ['PENDING' => 'pending', 'SUCCEEDED' => 'succeeded', 'FAILED' => 'failed']

注意: 对于“单位枚举”,由于它们在技术上没有值,HasEntries 特性将使用枚举的键作为值。因此,值始终与键相同。

IsComparable::is

检查给定的值是否等于自身。

示例

MovementsEnum::ME_TOO->is(MovementsEnum::ME_TOO); // true
MovementsEnum::ME_TOO->is(MovementsEnum::BLACK_LIVES_MATTER); // false
MovementsEnum::ME_TOO->is('ME_TOO'); // true
MovementsEnum::ME_TOO->is('Me_TOO'); // false
MovementsEnum::ME_TOO->is(123); // false

PromiseEnum::PENDING->is(PromiseEnum::PENDING); // true
PromiseEnum::PENDING->is(StatusEnum::PENDING); // false
PromiseEnum::PENDING->is(1); // true
PromiseEnum::PENDING->is('1'); // false
PromiseEnum::PENDING->is('yolo'); // false

StatusEnum::PENDING->is(StatusEnum::PENDING); // true
StatusEnum::PENDING->is(PromiseEnum::PENDING); // false
StatusEnum::PENDING->is('pending'); // true
StatusEnum::PENDING->is('PENDING'); // false
StatusEnum::PENDING->is(123); // false

IsComparable::isAny

检查给定的值中是否任何值等于自身。

示例

MovementsEnum::ME_TOO->isAny([MovementsEnum::ME_TOO]); // true
MovementsEnum::ME_TOO->isAny([MovementsEnum::ME_TOO, MovementsEnum::BLACK_LIVES_MATTER]); // true
MovementsEnum::ME_TOO->isAny(['ME_TOO', MovementsEnum::BLACK_LIVES_MATTER]); // true
MovementsEnum::ME_TOO->isAny(MovementsEnum::BLACK_LIVES_MATTER, 'Me_TOO', 123]); // false

PromiseEnum::PENDING->isAny([PromiseEnum::PENDING]); // true
PromiseEnum::PENDING->isAny([PromiseEnum::PENDING, MovementsEnum::BLACK_LIVES_MATTER]); // true
PromiseEnum::PENDING->isAny([1, MovementsEnum::BLACK_LIVES_MATTER]); // true
PromiseEnum::PENDING->isAny(MovementsEnum::BLACK_LIVES_MATTER, 'PENDING', 123]); // false

StatusEnum::PENDING->isAny([StatusEnum::PENDING]); // true
StatusEnum::PENDING->isAny([StatusEnum::PENDING, MovementsEnum::BLACK_LIVES_MATTER]); // true
StatusEnum::PENDING->isAny(['pending', MovementsEnum::BLACK_LIVES_MATTER]); // true
StatusEnum::PENDING->isAny(MovementsEnum::BLACK_LIVES_MATTER, 'PENDING', 123]); // false

IsComparable::isAll

检查给定的值中是否所有值都等于自身。

示例

MovementsEnum::ME_TOO->isAll([MovementsEnum::ME_TOO]); // true
MovementsEnum::ME_TOO->isAll([MovementsEnum::ME_TOO, 'ME_TOO']); // true
MovementsEnum::ME_TOO->isAll([MovementsEnum::ME_TOO, 'ME_TOO', MovementsEnum::BLACK_LIVES_MATTER]); // false

PromiseEnum::PENDING->isAll([PromiseEnum::PENDING]); // true
PromiseEnum::PENDING->isAll([PromiseEnum::PENDING, 1]); // true
PromiseEnum::PENDING->isAll([PromiseEnum::PENDING, 1, MovementsEnum::BLACK_LIVES_MATTER]); // false

StatusEnum::PENDING->isAll([StatusEnum::PENDING]); // true
StatusEnum::PENDING->isAll([StatusEnum::PENDING, 'pending']); // true
StatusEnum::PENDING->isAll([StatusEnum::PENDING, 'pending', MovementsEnum::BLACK_LIVES_MATTER]); // false

测试

composer test

变更日志

请参阅CHANGELOG以获取最近更改的更多信息。

贡献

如果您有兴趣为此项目做出贡献,请在提交拉取请求之前阅读我们的贡献文档

安全漏洞

请参阅我们关于如何报告安全漏洞的安全策略

鸣谢

许可

MIT许可证(MIT)。请参阅许可文件以获取更多信息。