PHP 8.0 là một bản cập nhật lớn của ngôn ngữ PHP. Nó chứa nhiều tính năng và tối ưu hóa mới bao gồm JIT, named arguments, union types, attributes, constructor property promotion, match expression, nullsafe operator và các cải tiến trong kiểu hệ thống, xử lý lỗi và tính nhất quán.
JIT (Just in Time)
JIT được cải tiến hơn và trong PHP 8 giới thiệu hai công cụ biên dịch JIT.
Và Tracing JIT, hứa hẹn nhất vì cho thấy hiệu suất tốt hơn khoảng 3 lần trên các điểm chuẩn tổng hợp và cải thiện 1,5–2 lần trên một số ứng dụng chạy dài cụ thể. Hiệu suất ứng dụng ngang bằng hoặc tốt hơn với PHP 7.4.

Cải thiện hệ thống loại và xử lý lỗi
- Kiểm tra loại chặt chẽ hơn cho các toán tử số học/bitwise RFC
- Xác thực phương pháp đặc điểm trừu tượng RFC
- Chữ ký chính xác của phương pháp ma thuật RFC
- Cảnh báo động cơ được phân loại lại RFC
- Lỗi nghiêm trọng đối với chữ ký phương thức không tương thích RFC
- Toán tử @ không còn tắt các lỗi nghiêm trọng nữa.
- Kế thừa với các phương thức riêng tư RFC
- Loại hỗn hợp RFC
- Loại trả về tĩnh RFC
- Các loại chức năng nội bộ Chủ đề email
- Các đối tượng mờ thay vì tài nguyên cho các phần mở rộng Curl , Gd , Sockets , OpenSSL , XMLWriter và XML
Các điều chỉnh và cải tiến cú pháp khác
- Cho phép một dấu phẩy ở cuối danh sách tham số RFC và danh sách sử dụng closure RFC
- Non-capturing catches RFC
- Điều chỉnh cú pháp biến RFC
- Coi các tên được đặt tên dưới dạng mã thông báo duy nhất RFC
Throw
bây giờ là một biểu thức RFC- Cho phép
::class
trên các đối tượng RFC
Các class, interface và function mới
- Lớp WeakMap
- Stringable interface
- str_contains(), str_starts_with(), str_ends_with()
- fdiv()
- get_debug_type()
- get_resource_id()
- Đối tượng token_get_all()
- Triển khai các API DOM Living Standard mới
Named arguments
- Chỉ xác định các thông số bắt buộc, bỏ qua các thông số tùy chọn.
- Các lập luận không phụ thuộc vào trật tự và tự ghi lại.
/*** PHP 7 ***/
htmlspecialchars($string, ENT_COMPAT | ENT_HTML401, 'UTF-8', false);
/*** PHP 8 ***/
htmlspecialchars($string, double_encode: false);
Attributes
Thay vì chú thích PHPDoc, giờ đây bạn có thể sử dụng siêu dữ liệu có cấu trúc với cú pháp gốc của PHP.
/*** PHP 7 ***/
class PostsController
{
/**
* @Route("/api/posts/{id}", methods={"GET"})
*/
public function get($id) { /* ... */ }
}
/*** PHP 8 ***/
class PostsController
{
#[Route("/api/posts/{id}", methods: ["GET"])]
public function get($id) { /* ... */ }
}
Constructor property promotion
Tiết kiệm viết mã hơn để xác định và khởi tạo thuộc tính.
/*** PHP 7 ***/
class Point {
public float $x;
public float $y;
public float $z;
public function __construct(
float $x = 0.0,
float $y = 0.0,
float $z = 0.0,
) {
$this->x = $x;
$this->y = $y;
$this->z = $z;
}
}
/*** PHP 8 ***/
class Point {
public function __construct(
public float $x = 0.0,
public float $y = 0.0,
public float $z = 0.0,
) {}
}
Union types
Thay vì các chú thích PHPDoc cho sự kết hợp của các kiểu, bạn có thể sử dụng các khai báo kiểu liên minh gốc được xác thực trong thời gian chạy.
/*** PHP 7 ***/
class Number {
/** @var int|float */
private $number;
/**
* @param float|int $number
*/
public function __construct($number) {
$this->number = $number;
}
}
new Number('NaN'); // Ok
/*** PHP 8 ***/
class Number {
public function __construct(
private int|float $number
) {}
}
new Number('NaN'); // TypeError
Match expression
Match là biểu thức mới tương tự như switch
và có các tính năng sau:
- Match là một biểu thức, có nghĩa là kết quả của nó có thể được lưu trữ trong một biến hoặc được trả về.
- Các nhánh so sánh chỉ hỗ trợ các biểu thức một dòng và không cần
break;
để kết thúc lệnh. - Match so sánh chặt chẽ.
/*** PHP 7 ***/
switch (8.0) {
case '8.0':
$result = "Oh no!";
break;
case 8.0:
$result = "This is what I expected";
break;
}
echo $result;
//> Oh no!
/*** PHP 8 ***/
echo match (8.0) {
'8.0' => "Oh no!",
8.0 => "This is what I expected",
};
//> This is what I expected
Toán tử Nullsafe
Thay vì điều kiện kiểm tra null
, bây giờ bạn có thể sử dụng một chuỗi các cuộc gọi với toán tử nullsafe mới.
Khi đánh giá một phần tử trong chuỗi fails
, quá trình thực thi của toàn bộ chuỗi sẽ bị hủy bỏ và toàn bộ chuỗi được gán là null
.
/*** PHP 7 ***/
$country = null;
if ($session !== null) {
$user = $session->user;
if ($user !== null) {
$address = $user->getAddress();
if ($address !== null) {
$country = $address->country;
}
}
}
/*** PHP 8 ***/
$country = $session?->user?->getAddress()?->country;
Nhất quán lỗi cho các chức năng nội bộ (Consistent type errors for internal functions)
Hầu hết các chức năng nội bộ hiện ném Error exception nếu việc xác thực các tham số không thành công.
/*** PHP 7 ***/
strlen([]); // Warning: strlen() expects parameter 1 to be string, array given
array_chunk([], -1); // Warning: array_chunk(): Size parameter expected to be greater than 0
/*** PHP 8 ***/
strlen([]); // TypeError: strlen(): Argument #1 ($str) must be of type string, array given
array_chunk([], -1); // ValueError: array_chunk(): Argument #2 ($length) must be greater than 0
Chuỗi Saner để so sánh số (Saner string to number comparisons)
/*** PHP 7 ***/
0 == 'foobar' // true
/*** PHP 8 ***/
0 == 'foobar' // false
Tham khảo: https://www.php.net/releases/8.0/en.php