bakame / aide-enums
PHP 中 Enum 操作的特质集合
Requires
- php: ^8.1
README
用于改进 PHP Enum 处理的特质和类的集合。
注意
Aide for Enum 辅助的子分支。
⚠️ 这是一个子分支,对于拉取请求和问题,请访问:https://github.com/bakame-php/aide
安装
Composer
composer require bakame-php/aide-enums
系统要求
您需要
- PHP >= 8.1,但推荐使用最新稳定版本的 PHP
使用方法
特质
工厂
根据名称启用创建纯 Enum 或支持 Enum。该特质添加了两个(2)新的静态方法,tryFromName
和 fromName
,并在纯 Enum 上重新引入了 tryFrom
和 from
方法。一旦添加到您的 Enum 中,您可以执行以下操作
<?ph HttpMethod::fromName('Get') === HttpMethod::Get; HttpMethod::tryFromName('Get') === HttpMethod::Get; HttpMethod::tryFromName('Unknown'); // returns null HttpMethod::tryFrom('Put') === HttpMethod::Put HttpMethod::From('Unknown'); //throw a ValueError
您需要 Bakame\Aide\Enum\Factory
特质来公开新的 API。
<?php use Bakame\Aide\Enum\Factory; enum HttpMethod { use Factory; case Get; case Post; case Put; case Head; case Options; }
信息
通过 公共静态方法 收集有关当前 Enum 的信息。此特质允许获取
- 案例数量通过
size
方法; - 枚举类型通过
isBacked
和isPure
方法; - 每个案例的名称通过
names
方法; - 枚举的可能值通过
values
方法; nameOf
,它返回与特定value
关联的名称
<?php HttpMethod::size(); //returns the number of cases HttpMethod::isBacked(); HttpMethod::isPure(); // returns the inverse of the `isBacked` method HttpMethod::names(); // returns a list of all the names in the enumeration HttpMethod::values(); // returns a list of all the names in the enumeration HttpMethod::nameOf(404); // returns the name associated with the given value // or null if it does not exist for the submitted value.
您需要 Bakame\Aide\Enum\Info
特质来公开新的 API。
<?php use Bakame\Aide\Enum\Info; enum HttpMethod: string { use Info; case Get = 'GET'; case Post = 'POST'; case Put = 'PUT'; case Head = 'HEAD'; case Options = 'OPTIONS' }
Hasser/Isser 方法
启用询问某些数据是否存在于 Enum 中
<?php HttpMethod::hasName('GET'); //returns false; HttpMethod::hasValue('GET'); //returns true; HttpMethod::has('Head'); //returns true; HttpMethod::hasCase('Header', 'HEAD'); //returns false;
hasValue
和 hasCase
将始终为纯枚举返回 false。
您需要 Bakame\Aide\Enum\Hasser
特质来公开新的 API。
<?php use Bakame\Aide\Enum\Hasser; enum HttpMethod: string { use Hasser; case Get = 'GET'; case Post = 'POST'; case Put = 'PUT'; case Head = 'HEAD'; case Options = 'OPTIONS' }
比较
Compare
特质添加了四个(4)方法来比较 Enum 实例。`equals` 和 `notEquals` 方法进行严格比较,而 `isOneOf` 和 `isNotOneOf` 方法进行宽松比较,考虑 Enum 的值或名称。
<?php HttpMethod::Get->equals(HttpMethod::Post); //returns false HttpMethod::Get->isOneOf('GET', 'Get', 'get'); //returns true because `Get` is present HttpMethod::Get->notEquals('get'); //returns true; HttpMethod::Get->isNotOneOf('Head'); //returns true;
您需要 Bakame\Aide\Enum\Compare
特质来公开新的 API。
<?php use Bakame\Aide\Enum\Compare; enum HttpMethod: string { use Compare; case Get = 'GET'; case Post = 'POST'; case Put = 'PUT'; case Head = 'HEAD'; case Options = 'OPTIONS' }
转换
Convert
特质添加了三个(3)方法来转换 Enum 实例。`toAssociative` 将 Enum 实例转换为关联数组,而 `toJavaScriptObject` 和 `toJavaScriptClass` 方法将 Enum 转换为等效的 JavaScript 结构。
<?php HttpMethod::toAssociative(); // returns tha associative array HttpMethod::toJavaScriptObject(); // returns a JavaScript object equivalent code as string HttpMethod::toJavaScriptClass(); // returns a JavaScript class equivalent code as string
您需要 Bakame\Aide\Enum\Convert
特质来公开新的 API。
<?php use Bakame\Aide\Enum\Convert; enum HttpMethod: string { use Convert; case Get = 'GET'; case Post = 'POST'; case Put = 'PUT'; case Head = 'HEAD'; case Options = 'OPTIONS' }
一应俱全
如果您想一起应用所有特质,只需使用包含所有已提及特质的单个特质即可 Bakame\Aide\Enum\Helper
。一旦添加到您的 enum 中,这里描述的所有方法都将可用于您的代码库。
您需要 Bakame\Aide\Enum\Helper
来公开新的 API。
<?php use Bakame\Aide\Enum\Helper; enum HttpMethod: string { use Helper; case Get = 'GET'; case Post = 'POST'; case Put = 'PUT'; case Head = 'HEAD'; case Options = 'OPTIONS' }
将 Enum 转换为 JavaScript 结构
虽然 Convert::toJavaScriptObject
和 Convert::toJavaScriptClass
方法足以将您的 Enum 转换为 JavaScript 代码,但幕后方法使用了 JavaScriptConverter
类。该类可以返回更精确的表示形式,更好地满足您的约束。
由于有两种(2)在 JavaScript 中创建 Enum 结构的方法,该类提供了两种(2)方法来允许转换。
在两种情况下,转换都可以通过方法进行配置,以控制格式化和 JavaScript 结构属性。
支持 Enum
例如,假设我有以下枚举
enum HttpStatusCode: int { case HTTP_OK = 200; case HTTP_REDIRECTION = 302; case HTTP_NOT_FOUND = 404; case HTTP_SERVER_ERROR = 500; }
可以使用 convertToObject
方法将其转换为对象。
use Bakame\Aide\Enum\JavaScriptConverter; echo JavaScriptConverter::new()->convertToObject(HttpStatusCode::class);
将生成以下JavaScript代码片段:
const HttpStatusCode = Object.freeze({ HTTP_OK: 200, HTTP_REDIRECTION: 302, HTTP_NOT_FOUND: 404, HTTP_SERVER_ERROR: 500 })
相反,使用 convertToClass
的方式如下:
echo JavaScriptConverter::new()->convertToClass(HttpStatusCode::class);
将生成以下JavaScript代码片段:
class HttpStatusCode { static HTTP_OK = new HttpStatusCode(200) static HTTP_REDIRECTION = new HttpStatusCode(302) static HTTP_NOT_FOUND = new HttpStatusCode(404) static HTTP_SERVER_ERROR = new HttpStatusCode(500) constructor(name) { this.name = name } }
当然,根据您的使用情况,您可以:
- 忽略或使用对象的不可变性;
- 忽略或使用JavaScript的
export
或export default
; - 更改类名或添加和/或更改对象变量名;
- 在声明对象属性值时使用
Symbol
; - 定义缩进空格以及换行符;
- 定义对象表示中尾随逗号的存在或不存在;
以下是一个更高级的转换器使用示例,以突出您如何配置它。
<?php use Bakame\Aide\Enum\JavaScriptConverter; use Illuminate\Support\Str; $converter = JavaScriptConverter::new() ->useImmutability() ->useExportDefault() ->useTrailingComma() ->useSymbol() ->indentSize(4) ->propertyNameCase( fn (string $name) => Str::of($name)->replace('HTTP_', '')->lower()->studly()->toString() ); echo $converter->convertToObject(HttpStatusCode::class, 'StatusCode');
将返回以下JavaScript代码:
const StatusCode = Object.freeze({ Ok: Symbol(200), Redirection: Symbol(302), NotFound: Symbol(404), ServerError: Symbol(500), }); export default StatusCode;
纯枚举
对于纯PHP枚举,转换器将为每个case分配一个唯一的 Symbol
值,从 Symbol(0)
开始,遵循PHP的case声明顺序。您可以使用 startAt
方法可选地配置起始值。
让我们看看以下PHP纯枚举:
enum Color { case Red; case Blue; case Green; }
可以使用 convertToObject
方法将其转换为对象。
use Bakame\Aide\Enum\JavaScriptConverter; echo JavaScriptConverter::new()->convertToObject(Color::class);
将生成以下JavaScript代码片段:
const Color = Object.freeze({ Red: Symbol(0), Blue: Symbol(1), Green: Symbol(2) })
如果您设置起始值为递增,则将得到不同的值
use Bakame\Aide\Enum\JavaScriptConverter; echo JavaScriptConverter::new() ->ignoreSymbol() ->valueStartAt(2) ->convertToClass(Color::class, 'Colour');
然后起始值将根据以下所示考虑:
class Colour { static Red = new Colour(Symbol(2)) static Blue = new Colour(Symbol(3)) static Green = new Colour(Symbol(4)) constructor(name) { this.name = name } }
注意
对于纯枚举,ignoreSymbol
和 useSymbol
方法对输出没有影响。
存储输出
转换器不会将结果字符串存储到JavaScript文件中,因为这部分由实现者自行决定。有几种方法可以做到这一点
- 使用纯PHP和
file_put_contents
或SplFileObject
; - 使用更健壮且经过实战检验的包,例如在packagist上找到的包。