vicgutt / php-enhanced-enum
增强PHP原生枚举的便利方法
v0.1.0
2022-11-05 16:24 UTC
Requires
- php: ^8.1
Requires (Dev)
- laravel/pint: ^1.0
- pestphp/pest: ^1.21
- phpstan/extension-installer: ^1.1
- phpstan/phpstan-deprecation-rules: ^1.0
- phpstan/phpstan-phpunit: ^1.0
- phpunit/phpunit: ^9.5
README
此包提供便利的单用途特性和接口,旨在独立增强原生PHP枚举。
提供的特性包括
- VicGutt\PhpEnhancedEnum\Concerns\
HasKeys - VicGutt\PhpEnhancedEnum\Concerns\
HasValues - VicGutt\PhpEnhancedEnum\Concerns\
HasEntries - VicGutt\PhpEnhancedEnum\Concerns\
IsComparable - VicGutt\PhpEnhancedEnum\Concerns\
Enumerable
提供的接口包括
- VicGutt\PhpEnhancedEnum\Contracts\
HasKeysContract - VicGutt\PhpEnhancedEnum\Contracts\
HasValuesContract - VicGutt\PhpEnhancedEnum\Contracts\
HasEntriesContract - VicGutt\PhpEnhancedEnum\Contracts\
IsComparableContract - VicGutt\PhpEnhancedEnum\Contracts\
EnumerableContract
注意: 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)。请参阅许可文件以获取更多信息。