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

QCon New York (13-15 tháng 6 năm 2023). Tìm hiểu các phương pháp hay nhất từ ​​các nhà phát triển cấp cao tại các công ty tiếp hợp sớm

PHP 8 - Các lớp và Enum

Thích In Dấu trang

28 tháng 11 năm 2022 26 phút đọc

qua

  • Deepak Vohra

xét bởi

  • Sergio De Simone

Viết cho InfoQ

Tham gia cộng đồng chuyên gia. Tăng khả năng hiển thị của bạn.
Phát triển sự nghiệp của bạn
Tìm hiểu thêm

Chìa khóa rút ra

  • PHP8. 1 bổ sung hỗ trợ cho các thuộc tính chỉ đọc, làm cho các thuộc tính của lớp trở nên bất biến và không thể sửa đổi
  • PHP8. 0 có một tính năng mới tự động thúc đẩy các tham số hàm tạo lớp thành các thuộc tính lớp tương ứng có cùng tên nếu các tham số hàm tạo được khai báo bằng công cụ sửa đổi khả năng hiển thị và không thuộc loại
    Fatal error: Uncaught Error: Cannot initialize readonly property A::$a from global scope 
    8
  • PHP8. 1 thêm hỗ trợ cho các hằng số giao diện và lớp cuối cùng và cho các hằng số giao diện có thể bị ghi đè.  
  • Kể từ PHP 8. 0, hằng số
    Fatal error: Uncaught Error: Cannot initialize readonly property A::$a from global scope 
    9 đặc biệt có thể được sử dụng trên các đối tượng và kể từ PHP 8. 1 đối tượng có thể được sử dụng trong
     $a->a = 2;
    00
  • PHP8. 1 bổ sung hỗ trợ cho kiểu liệt kê, hoặc gọi tắt là enum, để khai báo một tập hợp liệt kê các giá trị tương tự, mặc dù không giống với, đối tượng lớp
     

Bài viết này là một phần của loạt bài viết "PHP 8. x". Bạn có thể đăng ký để nhận thông báo về các bài viết mới trong loạt bài này qua RSS

PHP tiếp tục là một trong những ngôn ngữ kịch bản được sử dụng rộng rãi nhất trên web với 77. 3% của tất cả các trang web có ngôn ngữ lập trình phía máy chủ được biết là sử dụng nó theo w3tech. PHP 8 mang đến nhiều tính năng mới và những cải tiến khác mà chúng ta sẽ khám phá trong loạt bài viết này

 

    Nội dung được tài trợ có liên quan

  • [eBook] Hiểu về Kubernetes (Phiên bản cập nhật)

Nhà tài trợ liên quan

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

Điện toán đám mây Akamai dựa trên Linode. Một nền tảng phân phối rộng rãi và thân thiện với nhà phát triển để xây dựng, chạy và bảo mật khối lượng công việc trên đám mây. Bắt đầu dùng thử miễn phí ngay hôm nay

Trong bài viết này, chúng ta sẽ xem xét các tính năng mới của PHP 8 liên quan đến các lớp, bao gồm

  • Enums, một lớp trên các lớp để chỉ định danh sách liệt kê các giá trị có thể có cho một loại
  • Công cụ sửa đổi
     $a->a = 2;
    01 mới cho thuộc tính lớp, làm cho thuộc tính không thể sửa đổi sau khi khởi tạo
  • Quảng cáo tham số hàm tạo, hữu ích để tự động gán giá trị tham số hàm tạo cho một thuộc tính đối tượng

Thuộc tính lớp chỉ đọc

Các nhà phát triển đã tìm cách làm cho các thuộc tính của lớp trở nên bất biến đối với các trường hợp sử dụng, chẳng hạn như các đối tượng giá trị. Thông thường, các thuộc tính phải được khởi tạo một lần, thường là trong một hàm tạo và không bao giờ được sửa đổi. Một giải pháp thay thế đã được sử dụng là đặt một thuộc tính ở chế độ riêng tư và chỉ khai báo một phương thức getter công khai cho nó. Điều này làm giảm phạm vi sửa đổi nhưng không loại trừ sửa đổi. Để tạo bất biến thuộc tính lớp, PHP 8. 1 thêm hỗ trợ cho các thuộc tính chỉ đọc với điều kiện thuộc tính phải được nhập. Một thuộc tính đã nhập thực sự có thể được khai báo chỉ đọc với từ khóa chỉ đọc mới. Tập lệnh sau khai báo một thuộc tính

 $a->a = 2;
01 thuộc loại
 $a->a = 2;
03được gọi là
 $a->a = 2;
04. Giá trị của thuộc tính chỉ được đặt một lần trong hàm tạo. Tập lệnh xuất giá trị 1 khi chạy.  

a = $a;
   }
}
$a = new A(1);
echo $a->a;

Để chứng minh hiệu quả của việc làm cho thuộc tính chỉ đọc, hãy sửa đổi giá trị của nó bằng phép gán sau

 $a->a = 2;

Điều này sẽ tạo ra một thông báo lỗi

Fatal error: Uncaught Error: Cannot modify readonly property A::$a 

Để chứng minh rằng điều kiện mà thuộc tính

 $a->a = 2;
01 phải được nhập đúng, hãy thử tạo một thuộc tính chưa được nhập
 $a->a = 2;
01 như trong tập lệnh sau

a = $a;
   }
}
$a = new A(1);

Tập lệnh tạo thông báo lỗi.   

Fatal error: Readonly property A::$a must have type

Nếu không muốn một thuộc tính chỉ đọc có một loại cụ thể, bạn có thể khai báo thuộc tính đó là hỗn hợp, e. g

public readonly mixed $a;

Ngoài yêu cầu về loại, các hạn chế khác áp dụng cho thuộc tính

 $a->a = 2;
01. Thuộc tính chỉ đọc không thể được khai báo
 $a->a = 2;
08. Chạy đoạn script sau để chứng minh điều đó

a = $a;
   }
}
$a = new A(1);

Tập lệnh tạo thông báo lỗi

Fatal error: Static property A::$a cannot be readonly

Một thuộc tính chỉ đọc chỉ có thể được khởi tạo từ phạm vi mà nó được khai báo. Tập lệnh sau khởi tạo một thuộc tính chỉ đọc, nhưng không nằm trong phạm vi mà nó được khai báo.   

a=1; 

Tập lệnh tạo thông báo lỗi khi chạy

Fatal error: Uncaught Error: Cannot initialize readonly property A::$a from global scope 

Bạn có thể xem xét việc khai báo thuộc tính chỉ đọc với giá trị mặc định tại thời điểm khởi tạo, nhưng điều này sẽ không đặc biệt hữu ích vì bạn có thể sử dụng hằng số lớp để thay thế. Do đó, việc đặt giá trị mặc định cho thuộc tính chỉ đọc đã không được phép. Tập lệnh sau khai báo giá trị mặc định cho thuộc tính chỉ đọc

 $a->a = 2;
0

Tập lệnh tạo thông báo lỗi khi chạy

 $a->a = 2;
1

Mục tiêu của tính năng thuộc tính chỉ đọc là làm cho thuộc tính lớp không thay đổi. Do đó, không thể bỏ đặt thuộc tính chỉ đọc bằng unset() sau khi khởi tạo. Tập lệnh sau gọi unset() trên thuộc tính chỉ đọc sau khi được khởi tạo

 $a->a = 2;
2

Tập lệnh tạo thông báo lỗi khi chạy

 $a->a = 2;
3

Bạn luôn có thể gọi unset() trên thuộc tính chỉ đọc trước khi khởi tạo như trong tập lệnh sau

 $a->a = 2;
4

Tập lệnh chạy không có lỗi và xuất giá trị của

 $a->a = 2;
09.  

Không thể sửa đổi thuộc tính

 $a->a = 2;
01 bằng cách gán lại đơn giản hoặc bằng bất kỳ thao tác toán tử nào khác. Tập lệnh sau không sử dụng câu lệnh gán lại cho thuộc tính chỉ đọc mà sử dụng toán tử gia số trên thuộc tính đó.  

 $a->a = 2;
5

Hiệu quả là như nhau, và thông báo lỗi cũng vậy

 $a->a = 2;
6

Cụ thể, chỉ có thuộc tính

 $a->a = 2;
01 là bất biến, không phải bất kỳ đối tượng hoặc tài nguyên nào được lưu trữ trong đó. Bạn có thể sửa đổi bất kỳ đối tượng nào và thuộc tính không chỉ đọc được lưu trữ trong thuộc tính
 $a->a = 2;
01. Tập lệnh sau đặt giá trị của thuộc tính lớp
 $a->a = 2;
04 không phải là
 $a->a = 2;
01 thông qua thuộc tính chỉ đọc
 $a->a = 2;
15 thuộc loại
 $a->a = 2;
16.  

 $a->a = 2;
7

Tập lệnh chạy không có lỗi và xuất giá trị là 1.  

PHP8. 2 thêm các lớp chỉ đọc dưới dạng phần mở rộng của tính năng thuộc tính lớp chỉ đọc. Nếu một lớp được khai báo với công cụ sửa đổi

 $a->a = 2;
01, thì tất cả các thuộc tính của lớp là chỉ đọc hoàn toàn. Ví dụ, các thuộc tính lớp trong lớp chỉ đọc phải được nhập và không tĩnh

 $a->a = 2;
8

Các lớp chỉ đọc có một số hạn chế trong đó các thuộc tính động không thể được xác định và chỉ một lớp chỉ đọc mới có thể mở rộng một lớp chỉ đọc khác.  

Quảng cáo tài sản xây dựng

Mục tiêu của quảng cáo thuộc tính hàm tạo, một tính năng được giới thiệu trong PHP 8. 0, là làm cho việc khai báo và khởi tạo thuộc tính lớp không cần thiết. Để giải thích chi tiết, hãy xem xét tập lệnh sau trong đó các thuộc tính của lớp

 $a->a = 2;
18 và
 $a->a = 2;
19 được khai báo trong lớp
 $a->a = 2;
20 và được khởi tạo trong hàm tạo của lớp.  

 $a->a = 2;
9

Với tính năng quảng cáo thuộc tính hàm tạo mới, tập lệnh được giảm xuống như sau

Fatal error: Uncaught Error: Cannot modify readonly property A::$a 
0

Phần thân của hàm tạo có thể trống hoặc có thể chứa các câu lệnh khác, được chạy sau khi quảng cáo các đối số của hàm tạo cho các thuộc tính lớp tương ứng. Yêu cầu duy nhất để đối số hàm tạo được thăng cấp thành thuộc tính lớp là nó bao gồm một công cụ sửa đổi khả năng hiển thị. Giá trị đối số của hàm tạo được tự động gán cho một thuộc tính lớp có cùng tên.  

Đoạn script sau minh họa việc tự động thăng cấp và khởi tạo các đối số hàm tạo công khai cho các thuộc tính của lớp bằng cách sử dụng ví dụ về lớp

 $a->a = 2;
20 với lệnh gọi hàm tạo của lớp như sau.  

Fatal error: Uncaught Error: Cannot modify readonly property A::$a 
1

Bạn sẽ thấy rằng các thuộc tính của lớp được thêm vào và khởi tạo hoàn toàn, cho kết quả như sau

Fatal error: Uncaught Error: Cannot modify readonly property A::$a 
2

Nếu một đối số hàm tạo không bao gồm công cụ sửa đổi khả năng hiển thị, thì nó không được thăng cấp thành thuộc tính lớp tương ứng. Không phải tất cả các đối số hàm tạo đều phải được thăng cấp. Tập lệnh sau không quảng bá đối số hàm tạo $pt4 vì nó không được khai báo với công cụ sửa đổi khả năng hiển thị

Fatal error: Uncaught Error: Cannot modify readonly property A::$a 
3

Gọi phương thức khởi tạo của lớp Hình chữ nhật và xuất các giá trị thuộc tính của lớp, như trước đây. Trong trường hợp này, kết quả sẽ khác vì $pt4 không bao gồm công cụ sửa đổi khả năng hiển thị và do đó, nó không bao giờ được thăng cấp thành thuộc tính lớp tương ứng. Một thông báo cảnh báo được xuất ra

Fatal error: Uncaught Error: Cannot modify readonly property A::$a 
4

Bạn sẽ cần khai báo và khởi tạo thuộc tính lớp $pt4 một cách rõ ràng như trong tập lệnh đã sửa đổi

Fatal error: Uncaught Error: Cannot modify readonly property A::$a 
5

Bây giờ, bạn có thể gọi hàm tạo và thuộc tính lớp đầu ra như trước đây với cùng một đầu ra.   

Một yêu cầu khác để đối số hàm tạo của lớp được thăng cấp thành thuộc tính lớp tương ứng là nó không thuộc loại có thể gọi được. Đoạn script sau khai báo các đối số hàm tạo của loại có thể gọi được

Fatal error: Uncaught Error: Cannot modify readonly property A::$a 
6

Khi chạy tập lệnh tạo thông báo lỗi

Fatal error: Uncaught Error: Cannot modify readonly property A::$a 
7

Trong bài viết đầu tiên của loạt bài PHP 8, chúng tôi đã giải thích cách sử dụng toán tử new trong bộ khởi tạo, bao gồm khởi tạo giá trị mặc định cho tham số hàm. Toán tử mới cũng có thể được sử dụng để đặt các giá trị mặc định của tham số hàm tạo, cùng với quảng cáo thuộc tính hàm tạo, như trong tập lệnh sau

 

Fatal error: Uncaught Error: Cannot modify readonly property A::$a 
8

Hàm tạo lớp

 $a->a = 2;
20 có thể được gọi mà không có bất kỳ đối số hàm tạo nào và các giá trị thuộc tính được thăng hạng được xuất ra

Fatal error: Uncaught Error: Cannot modify readonly property A::$a 
9

đầu ra là

a = $a;
   }
}
$a = new A(1);
0

Đối tượng sử dụng trong định nghĩa()

Hàm

 $a->a = 2;
00 tích hợp được sử dụng để xác định các hằng số được đặt tên. Với PHP8. 1 đối tượng có thể được chuyển đến
 $a->a = 2;
00 như trong tập lệnh ví dụ sau.   

a = $a;
   }
}
$a = new A(1);
1

Đầu ra từ tập lệnh là

a = $a;
   }
}
$a = new A(1);
2

Hằng số lớp có thể được khai báo cuối cùng

PHP8. 1 cho phép bạn khai báo các hằng lớp bằng từ khóa final. Ngoài ra, nếu một hằng số lớp được khai báo cuối cùng trong một lớp, thì bất kỳ lớp nào mở rộng nó đều không thể ghi đè hoặc xác định lại giá trị của hằng số đó. Trong tập lệnh sau, hằng số lớp c, được khai báo là cuối cùng trong lớp A, được định nghĩa lại trong lớp B mở rộng nó

a = $a;
   }
}
$a = new A(1);
3

Khi tập lệnh được chạy, thông báo lỗi sau được tạo

a = $a;
   }
}
$a = new A(1);
4

Cái đặc biệt. hằng số lớp có thể được sử dụng trên các đối tượng

Cái đặc biệt. Hằng số

 $a->a = 2;
25, cho phép phân giải tên lớp đủ điều kiện tại thời điểm biên dịch, cũng có thể được sử dụng với các đối tượng lớp kể từ PHP 8. 0. Một điểm khác biệt là việc phân giải tên lớp xảy ra trong thời gian chạy với các đối tượng, không giống như việc phân giải thời gian biên dịch cho các lớp. sử dụng.
 $a->a = 2;
25 trên một đối tượng tương đương với việc gọi 
 $a->a = 2;
27 trên đối tượng. Đoạn script sau sử dụng. lớp trên một đối tượng của lớp A, xuất ra “A”.  

a = $a;
   }
}
$a = new A(1);
5

Hằng số giao diện có thể được ghi đè

Kể từ PHP 8. 1, các hằng số giao diện có thể bị ghi đè bởi một lớp hoặc giao diện kế thừa chúng. Trong tập lệnh sau, hằng số giao diện c bị ghi đè bởi hằng số lớp có cùng tên. Giá trị của hằng số bị ghi đè có thể giống hoặc khác.  

a = $a;
   }
}
$a = new A(1);
6

Cả hai giá trị không đổi có thể được xuất ra

a = $a;
   }
}
$a = new A(1);
7

đầu ra là

a = $a;
   }
}
$a = new A(1);
8

Vì nó giữ cho các hằng số lớp được khai báo là

 $a->a = 2;
28, nên các hằng số giao diện được khai báo là
 $a->a = 2;
28 không thể bị ghi đè. Tập lệnh sau ghi đè hằng số giao diện được khai báo
 $a->a = 2;
28

a = $a;
   }
}
$a = new A(1);
9

Xuất ra thông báo lỗi khi tập lệnh được chạy

Fatal error: Readonly property A::$a must have type
0

Chức năng tự động tải __autoload() bị xóa

Hàm

 $a->a = 2;
31 không được dùng trong PHP 7. 2. 0 đã bị xóa trong PHP 8. 0. Nếu hàm _
 $a->a = 2;
32 được gọi, kết quả thông báo lỗi sau

Fatal error: Readonly property A::$a must have type
1

 

liệt kê

Một phép liệt kê, hay viết tắt là enum, là một tính năng mới để khai báo một loại tùy chỉnh với một tập hợp rõ ràng các giá trị có thể. Cấu trúc ngôn ngữ mới enum được sử dụng để khai báo một kiểu liệt kê với kiểu liệt kê đơn giản nhất là kiểu trống

Fatal error: Readonly property A::$a must have type
2

Ví dụ, một enum có thể khai báo các giá trị có thể sử dụng từ khóa case

Fatal error: Readonly property A::$a must have type
3

Các cuộc thảo luận về liệt kê được gói gọn trong các lớp vì sự giống nhau của chúng

Làm thế nào enums tương tự như các lớp học

  • Một enum là một lớp. Ví dụ enum
     $a->a = 2;
    33 là một lớp và các giá trị có thể có của nó là các thể hiện đối tượng của lớp
  • Enums chia sẻ cùng một không gian tên với các lớp, giao diện và đặc điểm
  • Enums có thể tự động tải vì các lớp là
  • Mỗi giá trị enum, chẳng hạn như giá trị
     $a->a = 2;
    34 và
     $a->a = 2;
    35 cho
     $a->a = 2;
    33 enum là một thể hiện đối tượng. Một giá trị enum sẽ vượt qua kiểm tra loại
     $a->a = 2;
    16
  • Các giá trị của enum hoặc tên trường hợp được biểu diễn bên trong dưới dạng hằng số lớp và do đó phân biệt chữ hoa chữ thường

Enums hữu ích cho một số trường hợp sử dụng, chẳng hạn như

  • Một thay thế có cấu trúc cho một tập hợp các hằng số
  • Định nghĩa loại tùy chỉnh
  • mô hình hóa dữ liệu
  • Lập trình kiểu đơn nguyên
  • Xác định mô hình miền
  • Xác thực bằng cách làm cho các giá trị không được hỗ trợ không thể trình bày được, dẫn đến giảm yêu cầu kiểm tra mã

Chúng ta sẽ thảo luận về enum với một số ví dụ. Bởi vì các giá trị của enum là các đối tượng, chúng có thể được sử dụng ở nơi có thể sử dụng một đối tượng, bao gồm cả kiểu tham số hàm và kiểu trả về của hàm. Trong tập lệnh sau, enum

 $a->a = 2;
33 được sử dụng làm loại tham số hàm và loại trả về hàm

Fatal error: Readonly property A::$a must have type
4

Đầu ra từ tập lệnh là

Fatal error: Readonly property A::$a must have type
5

Tiếp theo, chúng ta sẽ sử dụng cùng một ví dụ về sắp xếp mảng mà chúng ta đã sử dụng trong bài viết đầu tiên của loạt bài này. Tham số cho hàm_______2_______39 thuộc loại

 $a->a = 2;
33, là một enum.  

Fatal error: Readonly property A::$a must have type
6

Giá trị đối tượng enum được so sánh bằng toán tử ==

Fatal error: Readonly property A::$a must have type
7

Ví dụ tương tự như được sử dụng với enums như sau

Fatal error: Readonly property A::$a must have type
8

Đầu ra của tập lệnh  cho ví dụ sắp xếp mảng là

Fatal error: Readonly property A::$a must have type
9

Vì một trường hợp enum, hoặc giá trị có thể, là một thể hiện đối tượng, ví dụ, toán tử instanceof có thể được sử dụng với một giá trị enum

public readonly mixed $a;
0

Giá trị của enum không được chuyển đổi thành chuỗi và không thể được sử dụng làm chuỗi tương đương. Ví dụ: nếu bạn gọi hàm

 $a->a = 2;
41 với đối số chuỗi

public readonly mixed $a;
1

Một lỗi sẽ dẫn đến

public readonly mixed $a;
2

Tất cả các giá trị enum hoặc trường hợp đều có thuộc tính chỉ đọc được gọi là tên có giá trị là tên phân biệt chữ hoa chữ thường của trường hợp. Thuộc tính tên có thể được sử dụng để gỡ lỗi. Ví dụ: câu lệnh in sau sẽ xuất ra “Asc”.  

public readonly mixed $a;
3

Các giá trị của enum phải là các giá trị duy nhất, phân biệt chữ hoa chữ thường. Đoạn script sau có các giá trị duy nhất

public readonly mixed $a;
4

Nhưng đoạn script sau không khai báo các giá trị duy nhất

public readonly mixed $a;
5

Tập lệnh tạo thông báo lỗi sau

public readonly mixed $a;
6

Các kiểu liệt kê mà chúng ta đã thảo luận là kiểu liệt kê cơ bản hoặc kiểu liệt kê thuần túy. Một enum thuần túy chỉ xác định các trường hợp thuần túy không có dữ liệu liên quan. Tiếp theo, chúng tôi thảo luận về một loại enums khác được gọi là enums được hỗ trợ

enums được hỗ trợ

Ví dụ, một enum được hỗ trợ xác định các giá trị tương đương vô hướng của loại

 $a->a = 2;
42 hoặc
 $a->a = 2;
03 cho các trường hợp enum.  

public readonly mixed $a;
7

Tương đương vô hướng có thể thuộc loại

 $a->a = 2;
03 hoặc
 $a->a = 2;
42, nhưng không phải là sự kết hợp của
 $a->a = 2;
46 và tất cả các trường hợp của một enum được hỗ trợ phải khai báo một giá trị vô hướng. Để minh họa, hãy sử dụng Backed Enum sau đây

public readonly mixed $a;
8

Nó sẽ tạo ra một thông báo lỗi

public readonly mixed $a;
9

Tương đương vô hướng cho các trường hợp enum được hỗ trợ phải là duy nhất. Để chứng minh, hãy sử dụng tập lệnh sau đây khai báo cùng một số vô hướng tương đương cho hai trường hợp enum

a = $a;
   }
}
$a = new A(1);
0

Tập lệnh sẽ dẫn đến thông báo lỗi

a = $a;
   }
}
$a = new A(1);
1

Tương đương vô hướng có thể là biểu thức chữ ngoài giá trị chữ, ví dụ

a = $a;
   }
}
$a = new A(1);
2

Tất cả các giá trị enum được hỗ trợ hoặc các trường hợp được hỗ trợ đều có thuộc tính chỉ đọc bổ sung có tên là

 $a->a = 2;
47 có giá trị là giá trị vô hướng của trường hợp được hỗ trợ. Ví dụ: câu lệnh
 $a->a = 2;
48 sau đây sẽ xuất ra giá trị tương đương vô hướng cho trường hợp
 $a->a = 2;
49

a = $a;
   }
}
$a = new A(1);
3

Ở đây, giá trị là thuộc tính chỉ đọc và không thể sửa đổi. Đoạn mã sau gán một biến làm tham chiếu đến thuộc tính giá trị của trường hợp được hỗ trợ

a = $a;
   }
}
$a = new A(1);
4

Việc gán biến sẽ tạo ra một thông báo lỗi

a = $a;
   }
}
$a = new A(1);
5

Các enum được hỗ trợ triển khai giao diện nội bộ BackedEnum khai báo hai phương thức

  •  $a->a = 2;
    50 – Lấy giá trị enum vô hướng cho trường hợp được hỗ trợ và trả về trường hợp enum tương ứng. Trả về một
     $a->a = 2;
    51 nếu không tìm thấy giá trị vô hướng
  •  $a->a = 2;
    52 – Lấy giá trị enum vô hướng cho trường hợp được hỗ trợ và trả về trường hợp enum tương ứng. Trả về null nếu không tìm thấy giá trị vô hướng

Đoạn script sau minh họa việc sử dụng các phương thức này

a = $a;
   }
}
$a = new A(1);
6

đầu ra là

a = $a;
   }
}
$a = new A(1);
7

Các phương thức

 $a->a = 2;
53 và
 $a->a = 2;
54 sử dụng các chế độ gõ nghiêm ngặt/yếu, mặc định là gõ yếu, hàm ý một số chuyển đổi ngầm định. Các giá trị chuỗi và float cho số nguyên được chuyển đổi thành giá trị số nguyên như được minh họa bởi tập lệnh sau

a = $a;
   }
}
$a = new A(1);
8

đầu ra là

a = $a;
   }
}
$a = new A(1);
9

Một chuỗi không thể được chuyển đổi thành một số nguyên không được chuyển khi một int được mong đợi, như trong

Fatal error: Static property A::$a cannot be readonly
0

Điều trước sẽ dẫn đến một thông báo lỗi

Fatal error: Static property A::$a cannot be readonly
1

Trong chế độ nhập nghiêm ngặt, chuyển đổi loại không được áp dụng và các thông báo lỗi như trước hoặc sau được tạo

Fatal error: Static property A::$a cannot be readonly
2

Cả enum thuần túy và được hỗ trợ đều triển khai một giao diện bên trong có tên là UniEnum cung cấp một phương thức tĩnh có tên là

 $a->a = 2;
55 để xuất các giá trị có thể có cho enum, i. e. , các trường hợp enum. Đoạn script sau minh họa phương pháp
 $a->a = 2;
55

Fatal error: Static property A::$a cannot be readonly
3

đầu ra là

Fatal error: Static property A::$a cannot be readonly
4

Enums có thể bao gồm các phương thức và triển khai giao diện

Enums, cả thuần túy và được hỗ trợ, có thể khai báo các phương thức, tương tự như các phương thức thể hiện của lớp. Enums cũng có thể thực hiện một giao diện. Enum phải thực hiện các chức năng giao diện ngoài bất kỳ chức năng nào khác. Tập lệnh sau đây là một biến thể của cùng một ví dụ sắp xếp mảng bao gồm một enum triển khai giao diện. enum triển khai một hàm  từ giao diện ngoài một hàm không thuộc giao diện.  

Fatal error: Static property A::$a cannot be readonly
5

Đầu ra từ tập lệnh như sau

Fatal error: Static property A::$a cannot be readonly
6

Một enum được hỗ trợ cũng có thể triển khai một giao diện và cung cấp các phương thức bổ sung như trong tập lệnh sau

Fatal error: Static property A::$a cannot be readonly
7

Đầu ra như sau

Fatal error: Static property A::$a cannot be readonly
6

Enums có thể khai báo các phương thức tĩnh

Một enum có thể khai báo các phương thức tĩnh. Trong một biến thể của ví dụ sắp xếp mảng, một phương thức tĩnh selectSortType() được sử dụng để chọn kiểu sắp xếp dựa trên độ dài của mảng được sắp xếp

Fatal error: Static property A::$a cannot be readonly
9

Đầu ra như sau

a=1; 
0

 

Enums có thể khai báo hằng số

Một enum có thể khai báo các hằng số. Đoạn script sau khai báo một hằng có tên là A.  

a=1; 
1

Các hằng số có thể đề cập đến các trường hợp riêng của enum, cũng là các hằng số. Tập lệnh sau để sắp xếp một mảng minh họa việc sử dụng các hằng tham chiếu đến enum mà chúng được khai báo

a=1; 
2

Đầu ra như sau

a=1; 
3

Bởi vì bản thân các giá trị của enum là các hằng số, nên một hằng số rõ ràng có thể không xác định lại giá trị của enum. Chúng tôi chứng minh điều này trong đoạn script sau

a=1; 
4

Tập lệnh tạo thông báo lỗi sau

a=1; 
5

Giá trị kiểu chữ của enum phải có thể đánh giá được tại thời điểm biên dịch, vì đoạn mã sau đây khai báo trường hợp enum là hằng số chứng minh

a=1; 
6

Một thông báo lỗi được tạo ra

a=1; 
7

Enums với những đặc điểm

Enums có thể sử dụng các đặc điểm. Tập lệnh sau đây để sắp xếp một mảng khai báo một đặc điểm có tên là

 $a->a = 2;
57 và sử dụng đặc điểm đó trong một enum

a=1; 
8

Đầu ra như sau

a=1; 
9

Làm thế nào là enums khác với các lớp học

Mặc dù chúng tôi đã đề cập rằng enum tương tự như các lớp, nhưng chúng khác nhau ở nhiều điểm

  • Enums được tuần tự hóa khác với các đối tượng
  • Enums không có trạng thái, điều mà một đối tượng lớp có
  • Enums không khai báo hàm tạo vì không cần khởi tạo đối tượng
  • Enums không thể mở rộng các enum khác;
  • Đối tượng và thuộc tính tĩnh không được hỗ trợ
  • Không thể khởi tạo Enums với toán tử mới
  • Đầu ra
     $a->a = 2;
    58 khác so với các đối tượng lớp

Để chứng minh một trong những điểm khác biệt này, hãy xem xét đoạn script sau trong đó một enum khai báo một thuộc tính lớp

Fatal error: Uncaught Error: Cannot initialize readonly property A::$a from global scope 
0

Tập lệnh tạo thông báo lỗi

Fatal error: Uncaught Error: Cannot initialize readonly property A::$a from global scope 
1

Để chứng minh một trong những khác biệt này, hãy xem xét tập lệnh sau trong đó một enum được khởi tạo

Fatal error: Uncaught Error: Cannot initialize readonly property A::$a from global scope 
2

Tập lệnh tạo thông báo lỗi

Fatal error: Uncaught Error: Cannot initialize readonly property A::$a from global scope 
3

Để chứng minh sự khác biệt khác, đầu ra

 $a->a = 2;
58 cho một enum thuần túy và một enum được hỗ trợ được liệt kê theo tập lệnh

Fatal error: Uncaught Error: Cannot initialize readonly property A::$a from global scope 
4

đầu ra là

Fatal error: Uncaught Error: Cannot initialize readonly property A::$a from global scope 
5

Enums không được khai báo phương thức

 $a->a = 2;
60. Để chứng minh, hãy sử dụng tập lệnh sau trong đó một enum triển khai giao diện
 $a->a = 2;
61 và cung cấp triển khai cho phương thức
 $a->a = 2;
62.  

Fatal error: Uncaught Error: Cannot initialize readonly property A::$a from global scope 
6

Tập lệnh tạo thông báo lỗi

Fatal error: Uncaught Error: Cannot initialize readonly property A::$a from global scope 
7

Trong bài viết này, chúng ta đã thảo luận về hầu hết các tính năng liên quan đến lớp trong PHP 8, bao gồm enums, công cụ sửa đổi chỉ đọc mới cho thuộc tính lớp và quảng bá tham số hàm tạo

Trong phần tiếp theo của loạt bài này, chúng ta sẽ khám phá các chức năng và phương thức liên quan đến các tính năng mới. …
 

Bài viết này là một phần của loạt bài viết "PHP 8. x". Bạn có thể đăng ký để nhận thông báo về các bài viết mới trong loạt bài này qua RSS

PHP tiếp tục là một trong những ngôn ngữ kịch bản được sử dụng rộng rãi nhất trên web với 77. 3% của tất cả các trang web có ngôn ngữ lập trình phía máy chủ được biết là sử dụng nó theo w3tech. PHP 8 mang đến nhiều tính năng mới và những cải tiến khác mà chúng ta sẽ khám phá trong loạt bài viết này

Thông tin về các Tác giả

Deepak Vohra

Hiển thị thêmHiển thị ít hơn

Lấy cảm hứng từ nội dung này?

Trở thành biên tập viên cho InfoQ là một trong những quyết định sáng suốt nhất trong sự nghiệp của tôi. Nó đã thử thách tôi và giúp tôi trưởng thành theo nhiều cách. Chúng tôi muốn có nhiều người tham gia nhóm của chúng tôi

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

Thomas Betts Trưởng ban biên tập, Thiết kế và kiến ​​trúc phần mềm @InfoQ;

Viết cho InfoQ

Xếp hạng bài viết này

nhận con nuôi

Phong cách

Đã liên hệ với tác giả

Nội dung này nằm trong chủ đề Ngôn ngữ lập trình

chủ đề liên quan
  • Phát triển
  • PHP8
  • PHP
  • Ngôn ngữ lập trình
  • Lập trình hệ thống
  • Đám mây
  • PHP8. x Loạt bài báo

  • biên tập liên quan

  • Phổ biến trên InfoQ

    • Microsoft ra mắt VALL-E, Mô hình ngôn ngữ TTS thay đổi cuộc chơi
    • Các nhà phát triển AI phát hành triển khai mã nguồn mở của thuật toán đào tạo ChatGPT
    • Google cung cấp hướng dẫn toàn diện về độ tin cậy của cơ sở hạ tầng đám mây
    • Tìm kiếm các phép đo đầy đủ cho chất lượng bên ngoài, bên trong và quy trình trong phát triển phần mềm
    • Apache Druid 25. 0 Cung cấp Công cụ truy vấn nhiều giai đoạn và Quản lý tác vụ Kubernetes
    • Trao quyền cho phụ nữ trong lĩnh vực STEM & Xây dựng các nhóm hòa nhập thông qua nấu ăn

Nội dung liên quan

  • PHP 8 — Thuộc tính, Biểu thức khớp và các cải tiến khác

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

  • PHP 8 - Cải tiến hệ thống loại

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

  • PHP 8 – Hàm và Phương thức

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

  • Báo cáo xu hướng InfoQ về AI, ML và Kỹ thuật dữ liệu—Tháng 8 năm 2022

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

  • AWS Lambda hiện hỗ trợ đồng thời tối đa cho SQS dưới dạng nguồn sự kiện

  • Sáu cách tối ưu hóa WebAssembly

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

  • Google cung cấp hướng dẫn toàn diện về độ tin cậy của cơ sở hạ tầng đám mây

  • Tính năng phân tích nhật ký trong nhật ký đám mây hiện có sẵn rộng rãi

  • Amazon Athena hiện hỗ trợ Apache Spark Engine

  • API xác thực địa chỉ của Google thường có sẵn để cải thiện độ chính xác của địa chỉ

  • Cách kiểm tra ranh giới cách ly lỗi của bạn trong đám mây

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

  • AWS phát hành SimSpace Weaver cho mô phỏng không gian thời gian thực

  • Dịch vụ chuyển bộ nhớ của Google hiện hỗ trợ khả năng sao chép thời gian thực không cần máy chủ

  • Amazon S3 mã hóa tất cả các đối tượng mới bằng AES-256

  • AWS giới thiệu Bản đồ phân tán chức năng bước để xử lý dữ liệu song song quy mô lớn

  • Microfrontends chống mẫu. Bảy năm trong chiến hào

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

  • Truy cập Zero Trust vào các ứng dụng doanh nghiệp với AWS Verified Access

  • Google Cloud giới thiệu các hành động nhạy cảm để cải thiện bảo mật cho tài khoản trả phí

  • Sử dụng công cụ mã để chèn lỗi ở cấp ứng dụng tại eBay

  • Kích thước máy ảo Ebsv5 được tối ưu hóa bộ nhớ mới của Microsoft trong Bản xem trước mang lại hiệu suất cao hơn

  • AWS công bố GA của cụm đàn hồi DocumentDB

  • Cách Starling xây dựng bộ xử lý thẻ của riêng họ

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

  • InfoQ eMag - Báo cáo xu hướng InfoQ 2022

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

  • Bơm nó lên. Thực sự thu được lợi ích từ Cloud Native Microservices

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

  • Các tiêu chuẩn cộng đồng xung đột, bản địa đám mây và viễn thông

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

  • Sử dụng Serverless WebSockets để kích hoạt tính năng nhắn tin theo thời gian thực

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

  • Các bản phát hành mang tính quyết định, có thể tái sản xuất, không gây ngạc nhiên trong Kỷ nguyên không có máy chủ

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

  • CloudFormation hoặc Terraform. Nền tảng Iac nào phù hợp nhất với bạn?

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

  • Hành trình đến với quản lý API trên đám mây

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

  • Bảo mật API và microservice trong đám mây

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

  • Xây dựng, thử nghiệm và triển khai API REST có thể mở rộng trong Go

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

  • Giao tiếp vi dịch vụ Polyglot bằng Dapr trên AKS

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

  • Chuyển sang phương pháp tiếp cận trái để chuẩn hóa API

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

  • Xây dựng hệ thống giao thông hiện đại với KubeEdge. Làm thế nào chúng tôi thực hiện nó

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

  • Trò chuyện bên lò sưởi với Docker CTO

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

  • Chọn cơ sở hạ tầng đám mây phù hợp cho khởi nghiệp SaaS của bạn

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

  • Xây dựng quy trình làm việc với AWS Step Functions

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

  • Xây dựng ứng dụng từ Edge đến Cloud

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

  • Zero Trust có ý nghĩa gì đối với Kubernetes?

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

  • Chức năng mạng gốc trên đám mây có ở đây

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

Bản tin InfoQ

Tổng hợp nội dung của tuần trước trên InfoQ được gửi vào thứ Ba hàng tuần. Tham gia cộng đồng hơn 250.000 nhà phát triển cấp cao. Xem một ví dụ

Nhập địa chỉ email của bạn

Chọn quốc gia của bạn Tôi đồng ý với InfoQ. com xử lý dữ liệu của tôi như được giải thích trong Thông báo về quyền riêng tư này.

Chúng tôi bảo vệ quyền riêng tư của bạn

xin chào người lạ

Bạn cần Đăng ký tài khoản InfoQ hoặc Đăng nhập hoặc đăng nhập để gửi bình luận. Nhưng còn rất nhiều điều đằng sau việc đăng ký

Kiểu dữ liệu enum trong PHP là gì?

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.

Khi nào nên sử dụng enum trong PHP?

Việc liệt kê rất hữu ích khi bạn muốn làm việc với một tập hợp cố định các giá trị liên quan . Ví dụ: bạn có thể sử dụng một enum để đại diện cho các bộ đồ trong một bộ bài hoặc loại phương tiện. Các enum của PHP khá phức tạp, với một số tính năng mượn từ các lớp.

Làm cách nào để lấy giá trị từ enum trong PHP?

Bạn có thể lấy một mảng gồm tất cả các giá trị của một enum được hỗ trợ trong PHP, theo cách sau. .
Gọi phương thức case() tĩnh trên enum được hỗ trợ để nhận một mảng gồm tất cả các trường hợp đã xác định (theo thứ tự khai báo);
Sử dụng array_column() trên mảng enum kết quả và chỉ định thuộc tính giá trị (công khai) làm khóa cột