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ụ Show
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-PatternCâ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ểuCó 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ỗngCó 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óaVì 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ụcNgà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ệnMột phép liệt kê có thể thực hiện một giao diện; Người bạn Đặc điểmPhé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
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 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ệnChú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
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úcNhiề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. |