PHP 7.4 là phiên bản mới nhất của ngôn ngữ PHP, với những cải tiến về khả năng đọc code, bảo trì và cách sử dụng. Bài viết sau sẽ giới thiệu về PHP 7.4 có gì mới và những lý do để các developer nên chuyển sang sử dụng phiên bản này ngay.
PHP 7.4 có ý nghĩa như thế nào?
PHP vẫn không ngừng cải thiện chính mình kể từ khi xuất hiện từ năm 1994. Với bản cập nhật 7.4 ra mắt vào 28/11/2019, PHP đã cung cấp cho người dùng nhiều tính năng mới. Như ở phiên bản thứ 7 của PHP, hiệu năng lẫn tốc độ vẫn được cải thiện đáng kể. Trong đó, tính năng mới thú vị nhất có thể là preload. Nó giúp tăng tốc độ thực thi tập lệnh. Cùng với đó là khả năng đơn giản hóa các dòng code thông thường. Từ đó, các dòng code có thể nhanh hơn và “sạch” hơn đáng kể.
PHP hiện nay được sử dụng trong hơn 78,9% các trang web. Theo W3techs, các trang web nổi tiếng nhất sử dụng PHP gồm có Wikipedia, Pinterest và cả Facebook.
Nếu so sánh với phiên bản PHP 5, đáng ngạc nhiên là tốc độ của PHP 7 nhanh hơn đến hai lần. Do đó, các trang web hỗ trợ WordPress chắc chắn có nhiều lợi nhất khi sử dụng PHP phiên bản mới.
Chỉ cần nhìn qua biểu đồ trên cũng có thể thấy ảnh hưởng to lớn của PHP. Cụ thể, 39.191.714 website hiện đang sử dụng PHP. Hơn nữa, PHP 7.4 đã cho ra kết quả thử nghiệm tốt hơn hẳn phiên bản PHP 7.3. Hiệu suất đã được cải thiện, cùng với đó là một số cải tiến khác về trải nghiệm người dùng. Bảng dưới đây cho thấy bài kiểm tra benchmark ở các phiên bản gần đây của PHP. Các tiêu chí được kiểm tra gồm có khả năng dễ sử dụng, tốc độ, hiệu suất,…
PHP 7.4 có gì mới?
Kể từ năm 2016, PHP7 bắt đầu phát hành các bản cập nhật đều đặn hàng năm. Mỗi năm là mỗi tính năng, bổ sung mới. Cùng với đó là cải thiện khả năng đọc, viết code. Do đó, PHP ngày càng trở nên tin cậy và thân thiện hơn với người dùng.
Sau khi giới thiệu về PHP 7.4 có gì mới một các tổng quát, hãy cùng đi sâu vào những thay đổi của phiên bản mới này.
Preload
Trước hết, hãy nói sơ về code. Khi sử dụng một framework hay các thư viện, tệp của chúng phải được tải và liên kết trên mỗi request. Preload (tải trước) là khi ta có thể tải các framework và thư viện vào OPCache. Nó cho phép máy chủ tải các tệp PHP, lưu trữ chúng trong bộ nhớ khi khởi động. Hơn nữa, chúng hoàn toàn khả dụng cho bất kỳ request nào sau này. Do đó, các công việc có thể được thực hiện nhanh chóng hơn.
Preload được chạy bởi một chỉ thị php.ini cụ thể: opache.preload. Nó có trình biên dịch script PHP và sẽ thực thi khi máy chủ khởi động. Ngoài ra, nó cũng có thể được sử dụng để preload nhiều tệp hơn, sau đó là tùy chọn biên dịch chúng.
Rõ ràng tính năng này rất tuyệt vời. Tuy vậy, nếu nguồn của các file preload bị thay đổi, máy chủ cần được khởi động lại. Các file được preload cũng sẽ được lưu trong bộ nhớ OPCache vĩnh viễn.
Spread Operator trong Array Expressions
Kể từ phiên bản 5.6, PHP đã bắt đầu hỗ trợ aurgument unpacking (spread operator) (giải nén đối số). Ở phiên bản 7.4, người dùng đã có thể sử dụng tính năng này với biểu thức mảng (array). Argument unpacking là một cú pháp để giải nén các mảng vào list đối số. Hơn nữa, chỉ cần thêm vào trước ba dấu chấm “…”, việc này đã có thể dễ dàng được thực hiện.
Ví dụ:
$animals = [‘dog’, ‘cat’];
$animalkingdom = [‘lion’, ‘elephant’, …$animals, ‘giraffe’];
// [‘lion’, ‘elephant’, ‘dog’, ‘cat’, ‘giraffe’];
Sau đó, mảng có thể được mở rộng từ bất kỳ đâu trong một mảng khác. Tất cả chỉ với một cú pháp Spread Operator đơn giản.
Ngoài ra, tính năng này cũng có thể được sử dụng ở trong một hàm:
function getNum() {
return [‘a’, ‘b’];
}
$num6 = […getNum(), ‘c’]; // [‘a’, ‘b’, ‘c’]
$num7 = […new NumIterator([‘a’, ‘b’, ‘c’])]; // [‘a’, ‘b’, ‘c’]
function arrGen() {
for($i = 11; $i < 15; $i++) {
yield $i;
}
}
$num8 = […arrGen()]; // [11, 12, 13, 14]
Hơn nữa, bây giờ người dùng hoàn toàn có thể extract các array cũng như generator, được một hàm trả về trực tiếp vào một mảng mới.
function getAnimals(){
return [‘dog’, ‘cat’, ‘elephant’];
}
$num1 = […getAnimals(), ‘lion’, ‘tiger’, ‘giraffe’];
Output trong PHP 7.4:
array(6) {
[0]=>
string(3) “dog”
[1]=>
string(3) “cat”
[2]=>
string(8) “elephant”
[3]=>
string(4) “lion”
[4]=>
string(5) “tiger”
[5]=>
string(7) “giraffe”
}
Với biểu thức array mới này, spread operator có hiệu suất cao hơn hẳn array_merge ở bản 7.3. Sở dĩ vì spread operator là một cấu trúc ngôn ngữ. Trong khi đó, array_merge lại là một hàm. Ngoài ra, array_merge chỉ hỗ trợ mảng.
Tuy nhiên, cần lưu ý chỉ có thể sử dụng cho các indexed array vì các key => value array không được hỗ trợ. Ngoài ra, PHP 7.4 còn có thể loại bỏ array_merge.
Một lợi ích khác của PHP 7.4 là sử dụng hàm generator. Một generator function cơ bản là giống một hàm thông thường. Ngoại trừ việc trả về một giá trị, generator function có thể trả về nhiều giá trị.
function generator() {
for ($i = 3; $i <= 5; $i++) {
yield $i;
}
}
$num1 = [0, 1, 2, …generator()];
Weak References
Hiện nay, PHP 7.4 đã có WeakReference (khác với WeakRed hay tiện ích mở rộng Weakref). WeakReference cho phép programmer gọi lại một tham chiếu đến một đối tượng. Việc này không ngăn các đối tượng bị hủy. Do đó, nó rất có ích trong việc triển khai các cấu trúc như cache.
Contravariant Parameter và Covariant Return
Hiện tại, PHP sử dụng hầu hết các kiểu tham số bất biến (invariant parameter) cũng như kiểu dữ liệu trả về (return type). Có nghĩa là, nếu một phương thức có tham số hay return type của X, thì tham số subtype hay return type cũng thuộc kiểu X.
Với PHP 7.4, nó cho phép covariant (được sắp xếp từ cụ thể đến tổng quan) và contravariant (thứ tự ngược lại) trên tham số và return type.
Ví dụ:
Covariant return type:
interface Factory {
function make(): object;
}
class UserFactory implements Factory {
function make(): User;
}
Contravariant parameter type:
interface Concatable {
function concat(Iterator $input);
}
class Collection implements Concatable {
// accepts all iterables, not just Iterator
function concat(iterable $input) {/* . . . */}
}
Typed Properties 2.0
Kể từ PHP5, type hint là một tính năng có sẵn, cho phép chỉ định loại biến dự kiến được truyền cho một hàm hay lớp. Trong quá trình nâng cấp lên PHP 7.2, kiểu dữ liệu đối tượng đã được bổ sung. Từ đó mang lại hy vọng về sự xuất hiện của nó với số lượng lớn hơn trong tương lai.
PHP 7.4 hiện nay có thể hỗ trợ các kiểu sau:
bool, int, float, string, array, object, iterable, self, parent
any class or interface name
?type // where “type” may be any of the above
Cần lưu ý rằng kiểu parent có thể được sử dụng trong các lớp. Không cần có tính nhất quán giữa kiểu parent với tham số hay kiểu trả về.
Ngoài ra, void và callable cũng không được hỗ trợ vì không còn phù hợp.
Ví dụ về một class, được viết cho PHP 7.3:
class User {
/** @var int $id */
private $id;
/** @var string $name */
private $name;
public function __construct(int $id, string $name) {
$this->id = $id;
$this->name = $name;
}
public function getId(): int {
return $this->id;
}
public function setId(int $id): void {
$this->id = $id;
}
public function getName(): string {
return $this->name;
}
public function setName(string $name): void {
$this->name = $name;
}
}
Arrow Functions 2.0
Anonymous Functions trong PHP tương đối dài dòng, thậm chí đối với những tác vụ đơn giản. Một phần do số lượng lớn của syntactic boilerplate, cũng như nhu cầu nhập biến thủ công.
Ở phiên bản PHP 7.3:
function array_values_from_keys($arr, $keys) {
return array_map(function ($x) use ($arr) { return $arr[$x]; }, $keys);
}
Đối với phiên bản 7.4:
function array_values_from_keys($arr, $keys) {
return array_map(fn($x) => $arr[$x], $keys);
}
Hiện nay, arrow function có dạng đơn giản hơn rất nhiều:
fn(parameter_list) => expr
Cú pháp hàm arrow cho phép sử dụng đa dạng các hàm như variadics, default values, parameter hay return types. Ngoài ra còn có by-reference passing và returning. Tuy vậy, code vẫn được đảm bảo dễ đọc và “sạch”.
Một điều nữa cần lưu ý, arrow function có quyền ưu tiên hàng thấp nhất. Ví dụ:
fn($x) => $x + $y
// is
fn($x) => ($x + $y)
// not
(fn($x) => $x) + $y
Giới thiệu về PHP 7.4: Deprecations
PHP 7.4 có khá nhiều deprecation – loại bỏ các tính năng hay thành phần cũ.
- Kiểu real
- Magic quotes legacy
- array_key_exists() với đối tượng
- Bộ lọc FILTER_SANITIZE_MAGIC_QUOTES
- Phương pháp reflection export()
- mb_strrpos() với cách encode làm đối số thứ 3
- implode() parameter order mix
- Unbinding $this khỏi non-static closures
- Hàm hebrevc()
- convert_cyr_string()
- Hàm money_format()
- ezmlm_hash()
- Hàm restore_include_path()
- allow_url_include ini directiv
Ngoài ra là một vài lưu ý quan trọng khác:
Thay đổi độ ưu tiên của Concatenation Operator
Hiện tại, độ ưu tiên của “.”, “+” và “-” là như nhau. Sự kết hợp của các toán tử này sẽ được xử lý theo thứ tự từ trái sang phải. Tuy nhiên, sang phiên bản PHP 7.4, “.” sẽ được ưu tiên sau. Do đó, cộng và trừ sẽ được thực hiện trước chuỗi.
echo “sum: ” . $a + $b;
// would be executed as if the code were as follows.
echo “sum :” . ($a + $b);
Sự thay đổi này nhằm đảm bảo ít lỗi xảy ra hơn. PHP 7.4 hiện là giải đoạn đầu trong việc loại bỏ các toán tử “+”, “-” và “.”. Nhưng dù gì cũng cần tham khảo ý kiến cho những thay đổi của PHP 8 sau này.
Left-Associative Ternary Operator
Khác với các ngôn ngữ khác, toán tử tenary trong PHP thuộc left-associative thay vì right-associative. Việc này không chỉ bất thường, mà còn làm các developer khá bối rối khi chuyển cách code giữa các ngôn ngữ khác nhau.
Lấy ví dụ đoạn code sau:
return $a == 1 ? ‘one’
: $a == 2 ? ‘two’
: $a == 3 ? ‘three’
: $a == 4 ? ‘four’
: ‘other’;
Với hầu hết các ngôn ngữ, nó sẽ được phiên dịch như sau:
return $a == 1 ? ‘one’
: ($a == 2 ? ‘two’
: ($a == 3 ? ‘three’
: ($a == 4 ? ‘four’
: ‘other’)))
Nhưng trong PHP, đó lại là một câu chuyện hoàn toàn khác:
return ((($a == 1 ? ‘one’
: $a == 2) ? ‘two’
: $a == 3) ? ‘three’
: $a == 4) ? ‘four’
: ‘other’;
Dĩ nhiên, sự bất thường này có thể gây ra những lỗi không đáng có. Tuy vậy, PHP 7.4 đang bắt đầu sử dụng dấu ngoặc, với hy vọng giảm thiểu các lỗi trong tương lai.
Kết luận
Tóm lại, sau khi tìm iểu về PHP 7.4 có gì mới cũng như các tính năng mới của nó, có thể thấy các developer hoàn toàn có thể đặt niềm tin vào phiên bản mới này.
Bên cạnh đó, WordPress chắc chắn hưởng rất nhiều lợi từ những cải tiến này. Gồm thời gian thực thi nhanh hơn, bộ nhớ sử dụng ít hơn.
Với sự có mặt của việc khai báo type fist-class property, type hiting hay hàm arrow merging… Cùng với đó là tộc độ nhanh đáng kể, PHP 7.4 chắc chắn sẽ làm hài lòng các developer hiện nay.