PHP 8 sẽ được chính thức phát hành vào ngày 26 tháng 11 năm 2020. Đây là một phiên bản chính mới hoàn toàn, nó sẽ có rất nhiều thay đổi mới và đột phá, cũng như nhiều tính năng mới và cải tiến về hiệu suất.
Nghe giang hồ đồn là PHP 8 sẽ có tốc độ bàn thờ so với các phiên bản trước :)
PHP 8 đang trong quá trình phát triển rất tích cực, với bản Alpha đầu tiên dự kiến phát hành ngày 25 tháng 6 năm 2020
PHP 8 có gì thay đổi
Do có nhiều sự thay đổi đột phá, nên có nhiều khả năng bạn sẽ phải thực hiện một số thay đổi trong code của mình để có thể chạy trên PHP 8.
Nếu bạn luôn cập nhật các bản phát hành mới nhất, thì việc nâng cấp cũng không quá khó, vì hầu hết các thay đổi đều được cập nhật theo trình tự trong các phiên bản trước 7.x
Và đừng lo lắng, tất cả những sự thay đổi sẽ được liệt kê trong bài viết này.
Bên cạnh việc phá vỡ các thay đổi (breaking changes), PHP 8 cũng mang đến một bộ các tính năng mới tuyệt vời như:
- JIT compiler
- Union types
- Attributes
- và một số thứ khác nữa
Các tính năng mới trong PHP 8
PHP 8 vẫn đang được phát triển, vì vậy danh sách này sẽ phát triển theo thời gian.
JIT compiler
Trình biên dịch “JIT” (Just In Time). Sẽ là một bước tiến hứa hẹn sẽ cải thiện hiệu suất đáng kể.
Để tìm hiểu thêm về JIT Compiler, bạn có thể tham khảo một vài viết khác mà tôi đã viết về nó ở đây.
Union types RFC
Do tính chất linh hoạt trong kiểu dữ liệu của PHP, do đó có rất nhiều trường hợp cần kết hợp nhiều kiểu dữ liệu. Do đó Union types sẽ hữu ích trong trường hợp này.
Union types sẽ là một tập hợp gồm 2 hay nhiều kiểu dữ liệu. Xem ví dụ sau để hiểu hơn:
1 | public function foo(Foo|Bar $input): int|float; |
Lưu ý: void
sẽ không được sử dụng trong Union types. Vì nó cho biết là “không trả về giá trị gì cả”. Mà đã không trả về gì thì làm gì còn kiểu gì khác nữa đúng ko ^^
Hơn thế nữa, nullable
có thể được sử dụng bằng cách |null
hoặc bằng cách thêm ký hiệu ?
vào phía trước kiểu dữ liệu khác.
1 | public function foo(Foo|null $foo): void; |
Attributes
Attributes (thuộc tính), thường được biết đến là annotations trong các ngôn ngữ khác, cung cấp một cách để thêm dữ liệu meta vào các class, mà không cần phải phân tích cú pháp.
Để xem nhanh, đây là một ví dụ về các thuộc tính trong sẽ như thế nào:
1 | use App\Attributes\ExampleAttribute; |
1 | <<Attribute>> |
Lưu ý: Attribute
từng được đặt tên là PhpAttribute
trong RFC trước đây, nhưng sau đó đã được thay đổi bằng một RFC mới.
Nếu bạn muốn tìm hiểu sâu về cách các thuộc tính hoạt động như thế nào và cách sử dụng, bạn có thể đọc thêm trong bài này https://stitcher.io/blog/attributes-in-php-8
Constructor property promotion RFC
RFC này thêm đường cú pháp để tạo các đối tượng giá trị hoặc đối tượng truyền dữ liệu. Thay vì chỉ định các thuộc tính lớp và hàm tạo cho chúng, giờ đây PHP có thể kết hợp chúng thành một.
Thay vì trước đây bạn phải khai báo khá nhiều như thế này:
1 | class Money |
Thì bây giờ bạn có thể đơn giản hóa bằng:
1 | class Money |
Có rất nhiều thứ để nói về vấn đề này, hôm nào rảnh mình sẽ viết một bài để giải thích kỹ hơn.
Trả về kiểu New static
Mặc dù đã có thể trả về self
, nhưng static
không phải là kiểu trả về hợp lệ cho đến phiên bản PHP 8.
Với bản chất được gõ động của PHP, đây là một tính năng sẽ hữu ích cho nhiều nhà phát triển.
1 | class Foo |
Kiểu dữ liệu mixed
mới
Một số người có thể gọi nó là một điều ác cần thiết: mixed
loại khiến nhiều người có cảm xúc lẫn lộn. Có một lý lẽ rất hay để đưa ra mặc dù: một kiểu thiếu có thể có nghĩa là rất nhiều thứ trong PHP:
- Hàm trả về không có gì hoặc null
- Chúng tôi đang mong đợi một trong nhiều loại
- Chúng tôi đang mong đợi một loại không thể được gợi ý trong PHP
Vì những lý do trên, đây là một điều tốt khi mixed
loại được thêm vào. mixed
chính nó có nghĩa là một trong những loại sau:
array
bool
callable
int
float
null
object
resource
string
Lưu ý rằng mixed
cũng có thể được sử dụng làm loại tham số hoặc thuộc tính, không chỉ là loại trả về.
Cũng lưu ý rằng vì mixed
đã bao gồm null
, nó không được phép biến nó thành nullable
. Sau đây sẽ gây ra lỗi:
1 | // Fatal error: Mixed types cannot be nullable, null is already part of the mixed type. |
Throw expression
RFC này thay đổi throw
từ một statement thành một expression, điều này cho phép ném ngoại lệ ở nhiều nơi mới:
1 | $triggerError = fn () => throw new MyError(); |
Cho phép sử dụng ::class
trên các đối tượng
Một tính năng mới, nhỏ nhưng hữu ích: giờ đây có thể sử dụng ::class
trên các đối tượng, thay vì phải sử dụng get_class()
trên chúng. Nó hoạt động tương tự như get_class()
.
1 | $foo = new Foo(); |