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 đượ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.
/*** PHP 7 ***/ | |
htmlspecialchars($string, ENT_COMPAT | ENT_HTML401, 'UTF-8', false); | |
/*** PHP 8 ***/ | |
htmlspecialchars($string, double_encode: false); |
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) { /* ... */ } | |
} |
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, | |
) {} | |
} |
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 là biểu thức mới tương tự như switch và có các tính năng sau:
/*** 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 |
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; |
/*** 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 |
Tham khảo:
Devmaster Academy via lcdung.top