PHP enum thành mảng

TUYÊN BỐ MIỄN TRỪ TRÁCH NHIỆM. Những điều sau đây là hoàn toàn cá nhân, không đầy đủ, cân nhắc/thông tin/phổ biến. Có thể có lỗi và không chính xác. Các đoạn mã được báo cáo chỉ là ví dụ


PHP8. 1. Sự trỗi dậy của phép liệt kê

PHP8. 1 giới thiệu cú pháp cho một phần tử mới, Enumeration

Trước đây, tôi thực sự tò mò về đối số và đã dành một chút thời gian để xác định cách triển khai của mình

Bây giờ liệt kê ở đây và là một cấu trúc gốc. Việc liệt kê trong PHP hiện có một họ ẩn

UnitEnum cơ bản với hợp đồng tối thiểu

interface UnitEnum{

  /* Methods */
  public static cases[]: array

}

BackedEnum đầy đủ hơn có thể liên kết các giá trị nguyên thủy [int hoặc chuỗi] với các thể hiện liệt kê

interface BackedEnum extends UnitEnum{ 

   /* Methods */
   public static from[int|string $value]: static
   public static tryFrom[int|string $value]: ?static

   /* Inherited methods */
   public static UnitEnum::cases[]: array

}

Các phần tử này là giao diện nhưng không có trong Không gian DEV vì được sử dụng bởi Công cụ PHP, được giới thiệu để kiểm tra kiểu. Cộng đồng cảm thấy rằng "đồ chơi mới" có thể giúp giảm đau nhưng có nhiều câu hỏi hơn và có thể, các phần mở rộng hoặc sửa đổi đối với RFC này có thể xuất hiện.  

Tôi đã luôn xem Bảng liệt kê dưới dạng Ký hiệu miền nhưng cũng hoạt động với Java, PHP RFC, nó đủ giống nhau để xác định một số trường hợp sử dụng thú vị nhưng. Cảnh báo. luôn luôn với những ý nghĩa cụ thể nảy sinh từ khái niệm liệt kê [số lượng ký hiệu hạn chế] và Tên miền. Tôi đã bắt kịp một số khoảnh khắc để trình bày một số ý tưởng với hy vọng rằng, ít nhất một số, có thể hữu ích


Bảng liệt kê PHP. một số Anti-Pattern

Câu tiếng Latinh "in cauda venenum" nhắc nhở chúng ta rằng điều tồi tệ đã kết thúc. Vì vậy, tôi quyết định trình bày một số ý tưởng tồi ngay từ đầu. Vì Bảng liệt kê là mới, nên một số sửa lỗi đã xuất hiện, chẳng hạn như trên tuần tự hóa hoặc trong trường hợp góc của Công cụ PHP, nhưng tôi vẫn ở mức trừu tượng cao

Hằng số khó hiểu

Có thể khai báo một số hằng bên trong một phép liệt kê nhưng hằng được khai báo không phải là "trường hợp" của phép liệt kê. Ngoài ra, nếu hữu ích để có một số giá trị cạnh hoặc giá trị liên quan bên trong phép liệt kê, chúng ta cần nhớ rằng const có thể lưu trữ cũng có thể gọi được và nếu không có chuyển đổi khác, chúng ta có thể gây nhầm lẫn cho Nhà phát triển

enum Size
{
    case Small;
    case Medium;
    case Large;


    public const Huge = self::Large;
    public const MaxValue_For_Large = 100;
    public const Cases = ['cases',Size::class];
}


var_export[Size::Cases[]];

Bảng liệt kê rỗng

Có thể viết một bảng liệt kê mà không có bất kỳ trường hợp nào [cũng được hỗ trợ]

enum TheEmptyEnum:int {} 

Vì vậy, chúng tôi có TheEmptyEnum. trường hợp là một mảng trống trong khi, trong ví dụ bên ngoài, không có trường hợp nào khả dụng, TheEmptyEnum. tryFrom trả về null

Bảng kê hàng hóa

Vì Phép liệt kê có thể lưu trữ chức năng và vì Phép liệt kê rỗng, nên có thể viết và liệt kê đóng vai trò của "Lớp hàng hóa"

enum Calculator
{
    static function sum[int $a,int $b]:int
    {
        return $a+$b;
    }
}


Calculator::sum[1,2];

Mô hình chống mẫu Singleton [?]

Khai thác từ một số thành ngữ Java, cũng có thể sử dụng trong PHP để liệt kê để xác định cách diễn đạt Singleton nhanh chóng và tiện lợi

enum DBFacade
{
    case INSTANCE;
    
    function connection[]:void
    {
        ...
    }
    
}


DBFacade::INSTANCE->connection[];

sự liệt kê. Generics & biểu thức liên tục

Ngày nay, phép liệt kê không thể được định nghĩa là tổng quát bằng cách sử dụng mẫu docblock và nếu một trường hợp có thể được sử dụng như hằng số, thì đó không thể là một phần tử nào đó đến từ hàm liệt kê


Và bây giờ. Phần tốt [?]

Chúng ta có thể có cách sử dụng liệt kê thú vị sau đây, luôn ghi nhớ khái niệm rằng chúng là những phần tử có thể đếm được

Người bạn giao diện

Một phép liệt kê có thể thực hiện một giao diện;

Người bạn Đặc điểm

Phép liệt kê là một môi trường hạn chế hơn và việc sử dụng các đặc điểm có thể là một cách để nâng cao một số khả năng liệt kê, đến từ PHP 8 mới. Các tính năng X, như chúng ta có thể thấy trong các dự án này

  • https. //github. com/Elao/PhpEnums
  • https. //github. com/josezenem/php-enums-extends
  • https. //github. com/dive-be/php-enum-utils


Máy trạng thái liệt kê

Máy trạng thái có vô số tập hợp trạng thái và do đó có thể sử dụng RFC mới và UnitEnum để xác định Máy trạng thái đang hoạt động

enum PeachesPipe
{
    case WASH;
    case PEEL;
    case CUT;
    case PUT_IN_JAR;
    case READY;
    
    function process[]:PeachesPipe
    {
       /** @var callable[]:PeachesPipe $call */ 
       $call = [$this,$this->name];
       return $call[]; 
    }
    
    
    private function WASH[]:PeachesPipe
    {
        echo $this->name.PHP_EOL;
        return PeachesPipe::PEEL;
    }
    
    private function PEEL[]:PeachesPipe
    {
        echo $this->name.PHP_EOL;
        return PeachesPipe::CUT;
    }
    
    private function CUT[]:PeachesPipe
    {
        echo $this->name.PHP_EOL;
        return PeachesPipe::PUT_IN_JAR;
    }
    
    private function PUT_IN_JAR[]:PeachesPipe
    {
        echo $this->name.PHP_EOL;
        return PeachesPipe::READY;
    }
}




$pipeline = PeachesPipe::WASH;


while[$pipeline !== PeachesPipe::READY]
{
    $pipeline = $pipeline->process[];
}

Mô hình chiến lược liệt kê

Chúng ta có thể sử dụng vô số thuật toán liên quan đến một Miền cụ thể, xác định các chiến lược liên quan bên trong một phép liệt kê

enum Currency
{
    case EUR;
    case USD;
}


final class Item implements Stringable
{
  function __construct[public readonly string $id, 
               public readonly int $quantity, 
               public readonly int $price, 
               public readonly Currency $currency]{}
   
   function __toString[]:string
   {
       return '[ id:'.$this->id.
              ', quantity: '.$this->quantity.
              ', price:'.$this->price.' '.$this->currency->name.' ]';
   }
}


final class Basket implements Stringable
{
	/** @param list $items **/
   function __construct[private array $items]{}
   
	/** @return list **/
   function items[]:array
   {
      return $this->items; 
   }
   
   function __toString[]:string
   {
       return '[Basket: '.var_export[$this->items,true].']';
   }
}




enum DiscountType:int
{
    case BRONZE=5;
    case SILVER=10;
    case GOLD=15;
    
    static function apply[Basket $basket, DiscountType $discount]:Basket
    {
        $factor = $discount->value/100;
        $items = array_map[
                   fn[Item $item]=>
                         new Item[$item->id,
                                  $item->quantity,
                                  [$item->price - [int][$item->price*$factor]],
                                  $item->currency],
                  $basket->items[]
                ];
       return new Basket[$items];
    }
    
}


$items = array[
       new Item['az123',2,100,Currency::EUR],
       new Item['azBCV',5,200,Currency::EUR],
       new Item['azKJI',1,150,Currency::EUR],
    ];
    
$basket = new Basket[$items];


$basket = DiscountType::apply[$basket,DiscountType::BRONZE];

Mô hình nhà máy liệt kê

Có thể tạo một tập hợp vô số phần tử từ hàm ẩn trong một phép liệt kê được hỗ trợ cụ thể

________số 8

Cũng có thể giới thiệu một số sự lười biếng bằng cách sử dụng bao đóng thay vì chức năng đơn giản và chơi với khái niệm const riêng [có thể gọi] và/hoặc đóng nhà cung cấp

Mẫu bộ xử lý

Một tập hợp vô số bộ xử lý có thể được thể hiện nhờ một phép liệt kê cũng bằng cách sử dụng một liên lạc của FP

enum Operation:int
{
   case SUM=1;
   case SUB=2;
   case MUL=3;
   case DIV=4;
   
   /** @return callable[Operation]:callable[int,int]:int **/
   static function processorsMap[]:callable
   {
      $processors = array[
        Operation::SUM->value =>fn[int $a, int $b]:int=>$a+$b,
        Operation::SUB->value =>fn[int $a, int $b]:int=>$a-$b,
        Operation::MUL->value =>fn[int $a, int $b]:int=>$a*$b,
        Operation::DIV->value =>fn[int $a, int $b]:int=>[int][$a/$b],
      ];
       
      /** @psalm-suppress PossiblyUndefinedIntArrayOffset */ 
     return fn[Operation $opKey]=>$processors[$opKey->value];
   }
}


$processors = Operation::processorsMap[];


echo $processors[Operation::SUM][1,3];

Mẫu bộ xử lý có điều kiện

Chúng tôi có thể có vô số bộ cờ quy định một hoạt động xử lý cụ thể và chúng tôi có thể sử dụng một phép liệt kê cho hoạt động đó

interface BackedEnum extends UnitEnum{ 

   /* Methods */
   public static from[int|string $value]: static
   public static tryFrom[int|string $value]: ?static

   /* Inherited methods */
   public static UnitEnum::cases[]: array

}
0

Một ví dụ thú vị và phức tạp hơn đến từ dự án này

  • https. //github. com/framjet/php-enum-bitmask

Trình tạo ngẫu nhiên liệt kê

Cũng có thể trích xuất một cách ngẫu nhiên từ các trường hợp liệt kê như sau

interface BackedEnum extends UnitEnum{ 

   /* Methods */
   public static from[int|string $value]: static
   public static tryFrom[int|string $value]: ?static

   /* Inherited methods */
   public static UnitEnum::cases[]: array

}
1



Phần kết thúc

Nhiều người không hài lòng với loại ý tưởng này nhưng tôi hy vọng họ có thể chỉ ra một số trường hợp sử dụng hữu ích nếu bạn cần luôn luôn không quên kỷ luật

Chúng ta có thể sử dụng enum làm mảng không?

Việc sử dụng enum để lập chỉ mục cho một mảng là hoàn toàn bình thường . Bạn không cần phải chỉ định từng giá trị enum, chúng sẽ tự động tăng thêm 1.

Làm cách nào để sử dụng kiểu dữ liệu enum trong PHP?

Trong PHP, Enums là một loại đối tượng đặc biệt. Bản thân Enum là một lớp và các trường hợp có thể xảy ra của nó là tất cả các đối tượng đơn lẻ của lớp đó. Điều đó có nghĩa là các trường hợp Enum là các đối tượng hợp lệ và có thể được sử dụng ở bất kỳ đâu mà một đối tượng có thể được sử dụng, bao gồm cả kiểm tra loại .

Khai báo enum trong PHP như thế nào?

Cú pháp liệt kê . Một Enum có thể tùy chọn khai báo chuỗi hoặc int làm giá trị được hỗ trợ. Enums cũng có thể mở rộng một lớp và/hoặc triển khai các giao diện. Nội bộ ở cấp trình phân tích cú pháp PHP, có một mã thông báo mới có tên T_ENUM với giá trị 369 được chỉ định. with the enum keyword, followed by the name of the Enum. An Enum can optionally declare string or int as backed values. Enums can also extend a class and/or implement interfaces. Internally at the PHP parser level, there is a new token with named T_ENUM with value 369 assigned.

Mảng liệt kê trong PHP là gì?

Liệt kê [hoặc enum] chủ yếu được sử dụng để gán tên cho các hằng tích phân , tên giúp chương trình dễ đọc và dễ bảo trì. Trong PHP, các kiểu dữ liệu liệt kê có thể được triển khai bằng cách sử dụng và mở rộng các lớp trừu tượng. Cách tiếp cận 1. Sử dụng lớp trừu tượng đơn giản để đóng gói thành viên dữ liệu.

Chủ Đề