bakame/aide-enums

PHP 中 Enum 操作的特质集合

资助包维护!
nyamsprod

0.1.0 2023-12-09 05:38 UTC

This package is auto-updated.

Last update: 2024-09-22 11:45:30 UTC


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)新的静态方法,tryFromNamefromName,并在纯 Enum 上重新引入了 tryFromfrom 方法。一旦添加到您的 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 方法;
  • 枚举类型通过 isBackedisPure 方法;
  • 每个案例的名称通过 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;

hasValuehasCase 将始终为纯枚举返回 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::toJavaScriptObjectConvert::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的 exportexport 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
  }
}

注意

对于纯枚举,ignoreSymboluseSymbol 方法对输出没有影响。

存储输出

转换器不会将结果字符串存储到JavaScript文件中,因为这部分由实现者自行决定。有几种方法可以做到这一点

  • 使用纯PHP和 file_put_contentsSplFileObject
  • 使用更健壮且经过实战检验的包,例如在packagist上找到的包。

致谢