Việc một function có nhiều tham số (với mình là từ 3 tham số trở nên), có thể khiến developer lúng túng khi sử dụng vì không nhớ rõ ý nghĩa của từng tham số, cũng như thứ tự truyền của chúng.
Ví dụ, function mkdir()
(function giúp tạo thư mục) trong PHP có 4 tham số lần lượt là:
$directory
: Bắt buộc, là đường dẫn để tạo thư mục$permissions
: Không bắt buộc, là khả năng truy cập vào thư mục (kiểu 0777, hay 0655), mặc định là 0777.$recursive
: Không bắt buộc, có cho phép tạo thư mục con ngay cả khi thư mục cha không tồn tại (cho phép tạo kiểu đệ quy), mặc định là false
.$context
: Không bắt buộc, còn ý nghĩa là gì thì mình cũng chẳng hiểu lắm, chưa bao giờ dùng đến tham số này.
Các vấn đề mà một developer có thể gặp phải khi sử dụng mkdir()
đó là:
$permissions
và $recursive
, không biết tham số nào được viết trước.$recursive
từ false
thành true
, developer buộc phải truyền cả tham số $permissions
(vì $permissions
đứng trước $recursive
).Cả hai vấn đề trên đều gây bất tiện khi sử dụng, để khắc phục nó, thì PHP cung cấp cú pháp mới cho phép truyền tham số theo tên gọi:
1
2
3
4
5
6
7
8
9
|
|
Lưu ý:
– Đây chỉ là cú pháp mới mà PHP 8 cung cấp để tiện sử dụng hơn khi cần, còn bạn vẫn có thể sử dụng cú pháp cũ bình thường trên phiên bản PHP 8 này.
– Tên tham số bạn không được phép “tự nghĩ ra” mà phải tuân theo tài liệu của PHP. Như trong ví dụ trên, recursive
và directory
là 2 tham số mà mình buộc phải tuân theo tài liệu mà PHP cung cấp.
Để xem “tên chuẩn” các tham số, có 2 cách:
Cách 1: Xem tài liệu chính thức trên trang chủ php.net (lưu ý phải xem trên trang chính thức, các trang khác có thể viết không đúng).
Cách 2: Sử dụng ReflectionFunction
.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
|
Lưu ý siêu quan trọng
Khuyên bạn nên sử dụng Cách 2 là chính xác nhất, Cách 1 không hẳn sẽ chính xác với mọi function. Như function mkdir
trong ví dụ trên, thì tài liệu PHP viết sai 2 tên tham số là pathname
và mode
, đáng lẽ nó phải là directory
và permissions
mới đúng.
Việc khởi tạo giá trị cho thuộc tính trong contructor của PHP 7 thường được viết như sau:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
|
Nhưng với PHP 8, bạn có thể viết ngắn gọn thành
1
2
3
4
5
6
7
8
9
10
|
|
PHP ngày càng hoàn thiện hơn về độ chặt chẽ của dữ liệu, trong phiên bản PHP 7.4, chúng ta có thể khai báo kiểu dữ liệu cho thuộc tính của lớp, tuy nhiên nó vẫn gặp một vài bất tiện. Nhưng bất tiện này đã khắc phục trong phiên bản 8 với khái niệm Union types – Cho phép một thuộc tính có thể thuộc nhiều kiểu dữ liệu.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
|
|
Nullsafe operator – tạm dịch là Toán tử null an toàn. Cho phép bạn truy cập vào giá trị của một thuộc tính ở giá trị null
mà không bị lỗi.
Ở các phiên bản PHP trước, để chắc chắn trước khi truy cập vào một giá trị, ta thường kiểm tra nó khác null
để tránh lỗi, và nhìn nó có vẻ dài dòng như sau:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
|
Nhưng với PHP 8, bạn có thể rút gọn thành:
1
2
3
|
|
Khi bất kỳ thuộc tính nào trong “chuỗi” $session?->user?->getAddress()?->country
là null, thì $country
sẽ nhận giá trị là null
và không có lỗi nào xảy ra.
Một biểu thức mới khá tương đồng với lệnh switch case
được đưa vào trong phiên bản PHP 8 lần này là match
, nhưng có một số điểm khác biệt sau:
match
là một biểu thức, nghĩa là giá trị của nó có thể được trả về, bạn có thể dễ dàng lưu nó vào một biến để xử lý cho tiện.match
chỉ được xử lý trên một dòng, nghĩa là bạn không cần break
match
so sánh chặt chẽ về kiểu dữ liệu, giống như bạn so sánh sử dụng ===
vậy.Bạn có thể xem ví dụ sau để hiểu rõ hơn:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
|
|
Lưu ý: match
khá tương đồng với switch case
, nhưng không thể thay thế hẳn switch case
.
Hiểu nhanh thì JIT (Just In Time) là một kỹ thuật được PHP tích hợp vào việc biên dịch code PHP thành mã máy, giúp PHP 8 đạt được hiệu năng cao gấp 1,5 – 2 lần so với PHP 7. Nhưng đừng vội mừng, hãy xem biểu đồ dưới đây và mình sẽ giải thích cho bạn hiểu:
Trong biểu đồ trên:
Từ biểu đồ trên, rút ra nhận xét rằng:
Chỉ có ứng dụng PHP đơn giản khi áp dụng JIT mới có hiệu năng cao, còn các ứng dụng PHP phức tạp, sử dụng các framework, cms phổ biến như WordPress, Symfony (Chắc laravel cũng không ngoại lệ) thì sử dụng JIT lại không đem lại nhiều lợi ích. Thậm chí như trường hợp của Symfony khi áp dụng JIT còn làm ứng dụng chạy chậm hơn so với lúc không áp dụng.
Để nói hết về JIT thì bài viết này là chưa đủ, mình sẽ trình bày chi tiết ở một bài viết khác về cách cài đặt, ưu nhược điểm, cũng như phân tích nên dùng JIT trong dự án thực tế hay không.
Một số cập nhật điển hình khác trên PHP 8 như sau:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
|
1
2
3
4
5
6
|
|
try {} catch () {}
có thể không cần biến $exception trong catch.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
|
|
» Tin mới nhất:
» Các tin khác: