Php 8.1

PHP8. 1 thêm hỗ trợ cho Enumerations. Enumeration, hay viết tắt là Enum, là một kiểu liệt kê có một số lượng cố định các giá trị có thể

Một sự tương tự phổ biến cho một Enum là phù hợp trong một cỗ bài chơi. Một bộ bài có bốn quân bài cố định. Câu lạc bộ, Kim cương, Trái tim và Spades

Trong PHP, những bộ quần áo này có thể được liệt kê bằng Enum

enum Suit {
    case Clubs;
    case Diamonds;
    case Hearts;
    case Spades;
}

Với

function enum_exists(string $enum, bool $autoload = true): bool {}
9 Enum, giờ đây có thể thực thi các loại khi chấp nhận hoặc trả về một giá trị phù hợp

function pick_card(Suit $suit) {}
pick_card(Suit::Clubs);
pick_card(Suit::Diamonds);
pick_card(Suit::Hearts);
pick_card(Suit::Spades);

Ngược lại với việc sử dụng các chuỗi hoặc số đặc biệt bên trong (i. e. số ma thuật) để lưu trữ và làm việc với các tham số, Enums làm cho mã ứng dụng dễ đọc hơn và tránh trạng thái ứng dụng không mong muốn

PHP8. 1 dự trữ và sử dụng từ khóa

interface UnitEnum {
    public static function cases(): array;
}   
0 để khai báo Enums. Cú pháp tương tự như cú pháp trait/class/interface

enum Suit {
    case Clubs;
    case Diamonds;
    case Hearts;
    case Spades;
}

Enums được khai báo với từ khóa

interface UnitEnum {
    public static function cases(): array;
}   
0, theo sau là tên của Enum. Một Enum có thể tùy chọn khai báo
interface UnitEnum {
    public static function cases(): array;
}   
2 hoặc
interface UnitEnum {
    public static function cases(): array;
}   
3 như. 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

interface UnitEnum {
    public static function cases(): array;
}   
4 với giá trị
interface UnitEnum {
    public static function cases(): array;
}   
5 được chỉ định

Enums cũng có thể giữ một giá trị cho từng trường hợp, điều này làm cho chúng trở thành Backed Enums

enum HTTPMethods: string {
    case GET = 'get';
    case POST = 'post';
}

Sau đây là một ví dụ về Enum khai báo loại giá trị được hỗ trợ và triển khai giao diện

enum RolesClassLikeNamespacedEnum: string implements TestFor {  
  case Admin = 'Administrator';  
  case Guest = 'Guest';  
  case Moderator = 'Moderator';  
}

PHP8. 1 cũng thêm một hàm

interface UnitEnum {
    public static function cases(): array;
}   
6 mới để kiểm tra xem một Enum đã cho có tồn tại hay không

function enum_exists(string $enum, bool $autoload = true): bool {}

Lưu ý rằng do , hàm

interface UnitEnum {
    public static function cases(): array;
}   
8 cũng trả về
interface UnitEnum {
    public static function cases(): array;
}   
9 cho một Enum

Các enum không được hỗ trợ bằng một giá trị sẽ tự động triển khai giao diện

class FakeEnum implements UnitEnum {}
0

interface UnitEnum {
    public static function cases(): array;
}   

Enums không thể triển khai giao diện này một cách rõ ràng vì nó được thực hiện bên trong bởi công cụ. Điều này chỉ để hỗ trợ xác định loại Enum đã cho. Phương thức trả về một mảng gồm tất cả các trường hợp của một Enum đã cho

Các lớp PHP không được phép triển khai giao diện này và dẫn đến lỗi nếu thử

class FakeEnum implements UnitEnum {}
Fatal error: Non-enum class FakeEnum cannot implement interface UnitEnum in .. on line ...

Mặc dù, không được phép khai báo một phương thức có tên

class FakeEnum implements UnitEnum {}
3

function pick_card(Suit $suit) {}
0
function pick_card(Suit $suit) {}
1

Nếu một Enum khai báo các giá trị được hỗ trợ vô hướng, thì Enum đó sẽ tự động gọi một giao diện

class FakeEnum implements UnitEnum {}
4. Tương tự như giao diện
class FakeEnum implements UnitEnum {}
0, không thể triển khai giao diện
class FakeEnum implements UnitEnum {}
4 một cách rõ ràng

function pick_card(Suit $suit) {}
2

Xem và để biết thông tin sử dụng của họ

Các lớp tiêu chuẩn không được phép triển khai giao diện này

function pick_card(Suit $suit) {}
3_______2_______4

Tương tự như hạn chế không cho phép một phương thức có tên

class FakeEnum implements UnitEnum {}
3 không được phép, mọi Enum được hỗ trợ không được khai báo một phương thức
Fatal error: Non-enum class FakeEnum cannot implement interface UnitEnum in .. on line ...
1 hoặc
Fatal error: Non-enum class FakeEnum cannot implement interface UnitEnum in .. on line ...
2

function pick_card(Suit $suit) {}
5_______2_______6

Enums được triển khai nội bộ trên các lớp PHP hàng đầu và chúng kế thừa hầu hết ngữ nghĩa của lớp với các hạn chế bổ sung được áp đặt

Enums hỗ trợ không gian tên, tự động tải, chúng có thể có các phương thức (nhưng), triển khai giao diện và nhiều hành vi khác liên quan đến các lớp PHP

Một enum cơ bản chỉ đơn giản là một cấu trúc

interface UnitEnum {
    public static function cases(): array;
}   
0, trong đó mỗi trường hợp được khai báo với từ khóa
Fatal error: Non-enum class FakeEnum cannot implement interface UnitEnum in .. on line ...
4. Với Enums được hỗ trợ trong PHP 8. 1, PHP hiện dành riêng
Fatal error: Non-enum class FakeEnum cannot implement interface UnitEnum in .. on line ...
5 làm từ dành riêng và ngăn mọi chức năng, lớp, giao diện, v.v. từ việc được tạo ra với
interface UnitEnum {
    public static function cases(): array;
}   
0. Nó có thể là một phần của không gian tên do những thay đổi trong cách PHP xem xét các từ khóa dành riêng trong các giá trị không gian tên

Trong cấu trúc

interface UnitEnum {
    public static function cases(): array;
}   
0, nó có thể chứa bất kỳ số lượng "trường hợp" nào, từ 0 đến không giới hạn. Cả hai khai báo Enum này đều hợp lệ

function pick_card(Suit $suit) {}
7
function pick_card(Suit $suit) {}
8

Có thể gán giá trị

interface UnitEnum {
    public static function cases(): array;
}   
2 hoặc
interface UnitEnum {
    public static function cases(): array;
}   
3 cho từng trường hợp trong Enum. Điều này có thể hữu ích khi tuần tự hóa dữ liệu, lưu trữ chúng trong cơ sở dữ liệu, v.v.

Enums giữ một giá trị, i. e. một Enum được hỗ trợ, phải

  1. Chỉ cho phép
    interface UnitEnum {
        public static function cases(): array;
    }   
    2 hoặc
    interface UnitEnum {
        public static function cases(): array;
    }   
    3
  2. .
  3. Không được phép lưu trữ hỗn hợp các giá trị
    interface UnitEnum {
        public static function cases(): array;
    }   
    2 và
    interface UnitEnum {
        public static function cases(): array;
    }   
    3
function pick_card(Suit $suit) {}
9

Để một Enum có thể liên kết các giá trị cho từng trường hợp (i. e. a Backed Enum) thì phải khai báo kiểu vô hướng tại phần khai báo Enum

Không làm như vậy dẫn đến một lỗi

pick_card(Suit::Clubs);
pick_card(Suit::Diamonds);
pick_card(Suit::Hearts);
pick_card(Suit::Spades);
0
pick_card(Suit::Clubs);
pick_card(Suit::Diamonds);
pick_card(Suit::Hearts);
pick_card(Suit::Spades);
1

Enums chỉ hỗ trợ các loại vô hướng

interface UnitEnum {
    public static function cases(): array;
}   
2 và
interface UnitEnum {
    public static function cases(): array;
}   
3. Bất kỳ loại nào khác, bao gồm
function pick_card(Suit $suit) {}
06,
function pick_card(Suit $suit) {}
07,
function pick_card(Suit $suit) {}
08,
function pick_card(Suit $suit) {}
09, hoặc thậm chí là loại liên kết
function pick_card(Suit $suit) {}
10 đều không được phép

pick_card(Suit::Clubs);
pick_card(Suit::Diamonds);
pick_card(Suit::Hearts);
pick_card(Suit::Spades);
2_______3_______3

Phần này đang trong quá trình hoàn thiện

Nếu một Enum khai báo kiểu giá trị vô hướng thì nó phải đặt giá trị cho tất cả các trường hợp

pick_card(Suit::Clubs);
pick_card(Suit::Diamonds);
pick_card(Suit::Hearts);
pick_card(Suit::Spades);
4

Trong đoạn mã trên,

function pick_card(Suit $suit) {}
11 Enum được khai báo có chứa
interface UnitEnum {
    public static function cases(): array;
}   
2, nhưng các trường hợp không được gán giá trị. Điều này không được phép và dẫn đến lỗi

Với một Backed Enum, các giá trị gán cho mỗi case phải cùng kiểu với khai báo trong type

PHP thực thi nghiêm ngặt điều này ngay cả khi không kích hoạt nghiêm ngặt_types

pick_card(Suit::Clubs);
pick_card(Suit::Diamonds);
pick_card(Suit::Hearts);
pick_card(Suit::Spades);
5
pick_card(Suit::Clubs);
pick_card(Suit::Diamonds);
pick_card(Suit::Hearts);
pick_card(Suit::Spades);
6

Phần này đang trong quá trình hoàn thiện

Một Enum hợp lệ không được chứa các trường hợp trùng lặp hoặc các giá trị trùng lặp. Ví dụ: cả hai khai báo này đều không hợp lệ

pick_card(Suit::Clubs);
pick_card(Suit::Diamonds);
pick_card(Suit::Hearts);
pick_card(Suit::Spades);
7
pick_card(Suit::Clubs);
pick_card(Suit::Diamonds);
pick_card(Suit::Hearts);
pick_card(Suit::Spades);
8

Các giá trị Enum cũng phải là duy nhất vì nó hỗ trợ truy xuất một đối tượng Enum từ một giá trị vô hướng cho trước

Bản thân tên của Enum không phân biệt chữ hoa chữ thường và nó tuân theo cách PHP xử lý các lớp và hàm theo cách không phân biệt chữ hoa chữ thường

Các trường hợp riêng lẻ trong Enum phân biệt chữ hoa chữ thường

pick_card(Suit::Clubs);
pick_card(Suit::Diamonds);
pick_card(Suit::Hearts);
pick_card(Suit::Spades);
9

Enums hỗ trợ không gian tên. Chúng tuân theo cú pháp không gian tên tiêu chuẩn được sử dụng trong các lớp, đặc điểm, giao diện, chức năng, v.v.

enum Suit {
    case Clubs;
    case Diamonds;
    case Hearts;
    case Spades;
}
0

Giống như PHP hỗ trợ tự động tải cho các lớp, đặc điểm và giao diện, Enums cũng hỗ trợ tự động tải

Lưu ý rằng điều này có thể yêu cầu cập nhật cho trình tạo bản đồ lớp quét các tệp để tìm các mục có thể tải tự động

Enums hỗ trợ đầy đủ tất cả các hằng số ma thuật mà PHP hỗ trợ cho các lớp

  • function pick_card(Suit $suit) {}
    14 bao gồm đề cập đến tên của chính Enum
  • function pick_card(Suit $suit) {}
    15 hằng số ma thuật đề cập đến tên của Enum từ bên trong Enum
  • function pick_card(Suit $suit) {}
    16 trong ngữ cảnh phương thức Enum
  • function pick_card(Suit $suit) {}
    17 trong ngữ cảnh phương thức Enum

Hàm lớp/đối tượng và
function pick_card(Suit $suit) {}
18

Enum hoạt động tương tự như các lớp khi chúng được sử dụng với các hàm hỗ trợ kiểm tra các lớp và đối tượng

Ví dụ:

function pick_card(Suit $suit) {}
19,
function pick_card(Suit $suit) {}
20,
function pick_card(Suit $suit) {}
21,
function pick_card(Suit $suit) {}
22 và
function pick_card(Suit $suit) {}
23 (mới trong PHP 8. 0) hoạt động như thể một Enum là một đối tượng PHP tiêu chuẩn

enum Suit {
    case Clubs;
    case Diamonds;
    case Hearts;
    case Spades;
}
1

Enums với Thuộc tính, Phương thức và Đặc điểm

Enums được tạo theo cách mà nó có thể so sánh một trường hợp Enum với trường hợp khác. Enums phải không trạng thái, vì chúng không cho phép lưu trữ các thuộc tính trong đó

Enums có thể chứa các phương thức. Chúng cũng hỗ trợ các công cụ sửa đổi khả năng hiển thị của phương thức tiêu chuẩn cũng như các phương thức tĩnh

Đây có thể là trường hợp sử dụng khá hữu ích, chẳng hạn như khai báo phương thức

function pick_card(Suit $suit) {}
24 trả về nhãn thân thiện với người dùng

enum Suit {
    case Clubs;
    case Diamonds;
    case Hearts;
    case Spades;
}
2

Đoạn mã trên sử dụng

function pick_card(Suit $suit) {}
25 biểu thức được thêm vào trong PHP 8. 0

Enums có thể thực hiện các giao diện. Enums phải hoàn thành các hợp đồng của các giao diện giống như lớp tiêu chuẩn phải

enum Suit {
    case Clubs;
    case Diamonds;
    case Hearts;
    case Spades;
}
3

Một trong những điểm khác biệt quan trọng nhất giữa Enum và class là Enum không được phép có bất kỳ trạng thái nào. Khai báo thuộc tính, hoặc đặt thuộc tính không được phép. thuộc tính tĩnh cũng không được phép

enum Suit {
    case Clubs;
    case Diamonds;
    case Hearts;
    case Spades;
}
4_______0_______5

Hơn nữa, các thuộc tính cài đặt động cũng không được phép

enum Suit {
    case Clubs;
    case Diamonds;
    case Hearts;
    case Spades;
}
6_______0_______7

Mặc dù bản thân các trường hợp Enum là các đối tượng, nhưng không được phép khởi tạo chúng bằng cấu trúc

function pick_card(Suit $suit) {}
26

Cả hai cấu trúc

function pick_card(Suit $suit) {}
26 sau đây đều không được phép

enum Suit {
    case Clubs;
    case Diamonds;
    case Hearts;
    case Spades;
}
8

Phần này đang trong quá trình hoàn thiện

Enums được khai báo nội bộ là cuối cùng và Enum không được kế thừa từ Enum khác hoặc một lớp

enum Suit {
    case Clubs;
    case Diamonds;
    case Hearts;
    case Spades;
}
9
enum HTTPMethods: string {
    case GET = 'get';
    case POST = 'post';
}
0

Nếu một lớp cố gắng mở rộng một Enum, điều đó cũng sẽ dẫn đến lỗi vì tất cả các Enum đều được khai báo là cuối cùng

enum HTTPMethods: string {
    case GET = 'get';
    case POST = 'post';
}
1
enum HTTPMethods: string {
    case GET = 'get';
    case POST = 'post';
}
2

Enums có thể

function pick_card(Suit $suit) {}
29 trait, miễn là trait đó không khai báo bất kỳ thuộc tính nào

enum HTTPMethods: string {
    case GET = 'get';
    case POST = 'post';
}
3

Nếu các đặc điểm được sử dụng chứa bất kỳ thuộc tính nào (tĩnh hoặc thuộc tính khác), thì việc sử dụng đặc điểm đó sẽ dẫn đến một lỗi nghiêm trọng

enum HTTPMethods: string {
    case GET = 'get';
    case POST = 'post';
}
4
enum HTTPMethods: string {
    case GET = 'get';
    case POST = 'post';
}
5

Để ngăn các đối tượng Enum có bất kỳ trạng thái nào và để đảm bảo hai Enum có thể so sánh được, Enums không cho phép triển khai một số phương thức ma thuật

  • function pick_card(Suit $suit) {}
    30. Để ngăn việc duy trì trạng thái trong các đối tượng Enum
  • function pick_card(Suit $suit) {}
    31. Để ngăn việc gán thuộc tính động và duy trì trạng thái
  • function pick_card(Suit $suit) {}
    32. Enums không hỗ trợ cấu trúc
    function pick_card(Suit $suit) {}
    33 tất cả
  • function pick_card(Suit $suit) {}
    34. Enums không được duy trì trạng thái
  • function pick_card(Suit $suit) {}
    35. Enums là đối tượng không thể sao chép
  • function pick_card(Suit $suit) {}
    36. Enums không hỗ trợ các phương pháp vòng đời
  • function pick_card(Suit $suit) {}
    37. Enums không hỗ trợ các phương pháp vòng đời
  • function pick_card(Suit $suit) {}
    38. Để ngăn trạng thái ép buộc đối với các đối tượng Enum

Tất cả các khai báo phương pháp ma thuật sau đây đều không được phép

enum HTTPMethods: string {
    case GET = 'get';
    case POST = 'post';
}
6

Nếu chúng được khai báo, nó sẽ gây ra lỗi nghiêm trọng với thông báo tương tự như thế này

enum HTTPMethods: string {
    case GET = 'get';
    case POST = 'post';
}
7

Enums lưu trữ các giá trị cố định, với các giá trị được hỗ trợ tùy chọn và chúng không cho phép trạng thái. Chúng phục vụ các mục đích rõ ràng khác nhau, nhưng Enums chia sẻ một số ngữ nghĩa với các lớp

ClassesEnumsSyntax_______2_______39
function pick_card(Suit $suit) {}
40✔✘✔✘✔✔✔✔✔✔✔✘✔✔✔✘Hằng số ma thuật.
function pick_card(Suit $suit) {}
14,
function pick_card(Suit $suit) {}
15, v.v. ✔✔
function pick_card(Suit $suit) {}
45Không bằngBằng nhauHỗ trợHỗ trợ không có thuộc tính

Sử dụng Enum

Trường hợp sử dụng chính của Enums là loại an toàn. Công cụ PHP sẽ đảm bảo rằng giá trị được truyền hoặc trả về thuộc về một trong các giá trị được phép. Không cần phải xác thực các giá trị đã truyền thuộc về một trong các loại được phép, công cụ PHP sẽ thực thi nó và cho phép các IDE cũng như trình phân tích tĩnh làm nổi bật các lỗi tiềm ẩn

Với Backed Enums, có thể lưu trữ các giá trị được liệt kê trong cơ sở dữ liệu hoặc bộ lưu trữ khác và khôi phục một đối tượng giống hệt nhau theo chương trình

Tại bất kỳ thời điểm nào, hai Enums giữ cùng một giá trị được coi là giống hệt nhau, giống như cách PHP coi hai chuỗi giống hệt nhau. Đây là sự khác biệt chính giữa hai đối tượng, bởi vì hai đối tượng từ một lớp khởi tạo không được coi là giống hệt nhau mặc dù chúng giữ chính xác các giá trị giống nhau

enum HTTPMethods: string {
    case GET = 'get';
    case POST = 'post';
}
8

Enums có thể được sử dụng như các loại tham số, trả về và thuộc tính. Khi tên Enum được sử dụng, các giá trị được truyền/đặt/trả về phải là một trong các giá trị được liệt kê

enum Suit {
    case Clubs;
    case Diamonds;
    case Hearts;
    case Spades;
}
enum RolesClassLikeNamespacedEnum: string implements TestFor {  
  case Admin = 'Administrator';  
  case Guest = 'Guest';  
  case Moderator = 'Moderator';  
}
0

Hàm

function pick_card(Suit $suit) {}
46 chấp nhận một giá trị liệt kê là
function enum_exists(string $enum, bool $autoload = true): bool {}
9 và việc chuyển bất kỳ giá trị nào khác sẽ dẫn đến một giá trị
function pick_card(Suit $suit) {}
48. Điều này có thể cải thiện đáng kể mã vì PHP xác thực các giá trị đã truyền mà không cần phải viết các xác nhận bổ sung bên trong hàm
function pick_card(Suit $suit) {}
46

enum RolesClassLikeNamespacedEnum: string implements TestFor {  
  case Admin = 'Administrator';  
  case Guest = 'Guest';  
  case Moderator = 'Moderator';  
}
1

Nếu bất kỳ giá trị nào khác với giá trị

function enum_exists(string $enum, bool $autoload = true): bool {}
9 Enum được chuyển, nó sẽ gây ra lỗi loại

enum RolesClassLikeNamespacedEnum: string implements TestFor {  
  case Admin = 'Administrator';  
  case Guest = 'Guest';  
  case Moderator = 'Moderator';  
}
2______12_______3

Nó cũng không cho phép sử dụng các giá trị từ Enum khác

enum RolesClassLikeNamespacedEnum: string implements TestFor {  
  case Admin = 'Administrator';  
  case Guest = 'Guest';  
  case Moderator = 'Moderator';  
}
4
enum RolesClassLikeNamespacedEnum: string implements TestFor {  
  case Admin = 'Administrator';  
  case Guest = 'Guest';  
  case Moderator = 'Moderator';  
}
5

Hơn nữa, nếu giá trị Enum không xác định được sử dụng, nó sẽ gây ra hằng số lớp không xác định vì giá trị Enum và hằng số lớp có chung cú pháp

Mỗi Enum chứa một thuộc tính

function pick_card(Suit $suit) {}
51 đề cập đến tên của thuộc tính. Giá trị này là chỉ đọc

enum RolesClassLikeNamespacedEnum: string implements TestFor {  
  case Admin = 'Administrator';  
  case Guest = 'Guest';  
  case Moderator = 'Moderator';  
}
6

Trong một Backed Enum, cũng có thuộc tính

function pick_card(Suit $suit) {}
52 cho giá trị được hỗ trợ (hoặc là
interface UnitEnum {
    public static function cases(): array;
}   
2 hoặc là
interface UnitEnum {
    public static function cases(): array;
}   
3)

enum RolesClassLikeNamespacedEnum: string implements TestFor {  
  case Admin = 'Administrator';  
  case Guest = 'Guest';  
  case Moderator = 'Moderator';  
}
7

Cố gắng thay đổi thuộc tính

function pick_card(Suit $suit) {}
51 hoặc
function pick_card(Suit $suit) {}
52 sẽ dẫn đến lỗi

enum RolesClassLikeNamespacedEnum: string implements TestFor {  
  case Admin = 'Administrator';  
  case Guest = 'Guest';  
  case Moderator = 'Moderator';  
}
8
enum RolesClassLikeNamespacedEnum: string implements TestFor {  
  case Admin = 'Administrator';  
  case Guest = 'Guest';  
  case Moderator = 'Moderator';  
}
9

Hơn nữa, Enums không có giá trị được hỗ trợ () không có thuộc tính

function pick_card(Suit $suit) {}
52. Chỉ Backed Enums () có thuộc tính
function pick_card(Suit $suit) {}
52. Cố gắng sử dụng một thuộc tính không xác định (bao gồm cả
function pick_card(Suit $suit) {}
52) hiện đang đưa ra một cảnh báo trong PHP 8. 1

function enum_exists(string $enum, bool $autoload = true): bool {}
0
function enum_exists(string $enum, bool $autoload = true): bool {}
1

Cả

class FakeEnum implements UnitEnum {}
0 và
class FakeEnum implements UnitEnum {}
4 Enums đều hỗ trợ một phương thức
function pick_card(Suit $suit) {}
66, phương thức này trả về tất cả các giá trị của Enum

function enum_exists(string $enum, bool $autoload = true): bool {}
2

Phương thức

function pick_card(Suit $suit) {}
67 trả về một mảng gồm tất cả các Enum có thể. Các giá trị trả về là chính các đối tượng Enum chứ không phải thuộc tính tên hoặc giá trị

Nhận Enum theo giá trị được hỗ trợ

Tất cả các Backed Enums() đều hỗ trợ các phương thức

Fatal error: Non-enum class FakeEnum cannot implement interface UnitEnum in .. on line ...
1 và
Fatal error: Non-enum class FakeEnum cannot implement interface UnitEnum in .. on line ...
2 cho phép truy xuất một thể hiện từ giá trị được hỗ trợ

function enum_exists(string $enum, bool $autoload = true): bool {}
3

Nếu không có Enum theo giá trị đó, PHP sẽ đưa ra một ngoại lệ

function pick_card(Suit $suit) {}
71


Ngoài ra còn có một phương thức

Fatal error: Non-enum class FakeEnum cannot implement interface UnitEnum in .. on line ...
2, trả về
function pick_card(Suit $suit) {}
07 nếu một Enum không tồn tại bởi giá trị đó

function enum_exists(string $enum, bool $autoload = true): bool {}
4

Cả hai và Enums đều có thể được tuần tự hóa và hủy đăng ký bằng cách sử dụng các hàm

function pick_card(Suit $suit) {}
74 và
function pick_card(Suit $suit) {}
75 tích hợp

Biểu mẫu được đánh số tự động sẽ có mã định danh

function pick_card(Suit $suit) {}
76 và tên của Enum

function enum_exists(string $enum, bool $autoload = true): bool {}
5_______1_______6

Trên Backed Enums, các giá trị được tuần tự hóa tiếp tục là tên của thành viên;

function enum_exists(string $enum, bool $autoload = true): bool {}
7
function enum_exists(string $enum, bool $autoload = true): bool {}
8

Lưu ý rằng cú pháp unserialization không tương thích với các phiên bản PHP cũ hơn. Bất kỳ chuỗi Enums được tuần tự hóa nào cũng không thể được hủy đăng ký trên các phiên bản PHP cũ hơn. Cố gắng làm như vậy dẫn đến một cảnh báo (_______2_______77) và

function pick_card(Suit $suit) {}
75 trả về
function pick_card(Suit $suit) {}
79


Tác động tương thích ngược

Enums sử dụng cú pháp mới và không thể sử dụng Enums trong các phiên bản PHP trước 8. 1

Các cách tiếp cận PHP gốc như myclabs/php-enum không tương thích với PHP 8. 1 bảng liệt kê

Cú pháp Enum sẽ dẫn đến một

function pick_card(Suit $suit) {}
80 trong PHP < 8. 1. Hơn nữa, không thể trong các phiên bản PHP cũ hơn