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ể
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