Các tính năng mới trong PHP 8.5
(stitcher.io)- PHP 8.5 là một bản cập nhật lớn bao gồm nhiều tính năng như toán tử pipe, clone with, trình phân tích URI mới
- Toán tử pipe giúp đơn giản hóa chuỗi gọi hàm, tăng khả năng đọc và bảo trì
- Tính năng Clone with cho phép thay đổi giá trị thuộc tính đồng thời khi sao chép đối tượng, nhưng có một số giới hạn với thuộc tính
readonly - Các tiện ích cho nhà phát triển được tăng cường với
#[NoDiscard], ép kiểu(void), hỗ trợ biểu thức hằng cho closure, in backtrace của fatal error - Phiên bản này cũng bao gồm các cải tiến chi tiết như xử lý mảng, kiểm tra thuộc tính, loại bỏ ép kiểu không chuẩn và các thay đổi liên quan đến tương thích ngược
Các tính năng mới chính
-
Bổ sung toán tử pipe (
|>) cho phép viết mã theo kiểu chuỗi, truyền trực tiếp kết quả của một hàm vào hàm tiếp theo- Hỗ trợ cấu trúc biến đổi dữ liệu theo từng bước thay vì gọi hàm lồng nhau
- Trong ví dụ mã,
trim,str_replace,strtolowerđược nối tuần tự
-
Tính năng Clone with cho phép thay đổi giá trị thuộc tính đồng thời khi sao chép đối tượng
- Trong lớp ví dụ
Book, được dùng dưới dạngclone($this, ['title' => $title]) - Tuy nhiên, khi sao chép thuộc tính
readonlytừ bên ngoài thì cần chỉ định truy cậppublic(set)
- Trong lớp ví dụ
-
Bổ sung thuộc tính
#[NoDiscard]và ép kiểu(void)- Có thể đánh dấu các hàm sẽ phát cảnh báo nếu giá trị trả về bị bỏ qua
- Có thể dùng ép kiểu
(void)để chặn cảnh báo
-
Cải tiến closure cho phép dùng closure và first-class callable trong biểu thức hằng
- Ví dụ có thể định nghĩa trong attribute dưới dạng
#[SkipDiscovery(static function (...))] - Các closure này bắt buộc phải được khai báo là
staticvà không thể truy cập biến bên ngoài
- Ví dụ có thể định nghĩa trong attribute dưới dạng
-
Bổ sung tính năng in backtrace cho fatal error
- Thông tin stack trace trước đây không hiển thị nay sẽ được đưa vào thông báo lỗi, giúp gỡ lỗi dễ hơn
Các tính năng liên quan đến mảng và URI
-
Bổ sung các hàm
array_first()vàarray_last()- Trả về phần tử đầu tiên và cuối cùng của mảng một cách đơn giản
- Thay thế cách truy cập phức tạp trước đây dùng
array_key_first()vàarray_key_last()
-
Bổ sung trình phân tích URI mới
- Cung cấp các phương thức như
getHost(),getScheme(),getPort()thông qua lớpUri\Rfc3986\Uri - Giúp đơn giản hóa việc thao tác và phân tích URI
- Cung cấp các phương thức như
Các tính năng liên quan đến thuộc tính và kiểm tra
- Giới thiệu thuộc tính
#[DelayedTargetValidation]- Có thể trì hoãn thời điểm kiểm tra từ compile time sang runtime đối với một số attribute như
#[Override] - Mục đích là giảm bớt các vấn đề về tương thích ngược
- Có thể trì hoãn thời điểm kiểm tra từ compile time sang runtime đối với một số attribute như
Các thay đổi nhỏ khác
- Hỗ trợ asymmetric visibility cho thuộc tính tĩnh
- Có thể gắn attribute cho hằng ngoài class
- Property promotion trong constructor có thể áp dụng cho cả thuộc tính
final - Có thể áp dụng thuộc tính
#[\Override]cho property - Bổ sung thuộc tính
Dom\Element::$outerHTML - Extension Exif hỗ trợ ảnh HEIF/HEIC
- Bổ sung cờ
FILTER_THROW_ON_FAILUREkhi gọifilter_var()
Các thay đổi loại bỏ và không tương thích
- Ngừng hỗ trợ các tên ép kiểu không chuẩn như
(boolean),(integer) - Loại bỏ cách dùng dấu backtick(```) như bí danh của
shell_exec() - Loại bỏ tính năng khai báo lại hằng số
- Xóa cấu hình ini
disabled_classes - Có thể xem toàn bộ danh sách thay đổi và mục bị loại bỏ trong tài liệu nâng cấp PHP 8.5
Tóm tắt tổng thể
- PHP 8.5 là phiên bản cải thiện trải nghiệm phát triển nói chung ở các mặt như độ dễ đọc của mã, gỡ lỗi, xử lý thuộc tính, thao tác mảng
- Toán tử pipe và trình phân tích URI ảnh hưởng trực tiếp đến việc đơn giản hóa mã trong thực tế
- Những thay đổi như trì hoãn kiểm tra attribute, các hàm mảng mới, in backtrace giúp tăng khả năng bảo trì và độ ổn định
- Một số cú pháp và cấu hình không chuẩn bị loại bỏ nên cần rà soát lại mã nguồn
- Nhìn chung, đây là bản phát hành tập trung vào tăng tính nhất quán của ngôn ngữ và cải thiện tiện ích cho nhà phát triển
1 bình luận
Bình luận trên Hacker News
Tôi vẫn yêu PHP
23 năm trước tôi đã viết phần mềm mã hóa cho PHP, và đến giờ nó vẫn chạy tốt
Tôi vẫn đang vận hành một bản tin về PHP, và cộng đồng này vẫn rất mạnh
Tôi cũng dùng Python và Node.js, nhưng với những việc nhanh và đơn giản thì cuối cùng tôi vẫn quay lại với PHP
Tuy vậy, việc PHP trở nên phức tạp hơn nhiều kể từ sau PHP 5 cũng giống như con dao hai lưỡi
Trong lúc Python chuyển từ 2 sang 3, PHP đã tiến hóa từ 5.2→5.3 và 5.6→7.0
Nhờ namespace, autoloading PSR0, cải tiến parser và nhiều thứ khác, tốc độ lẫn cấu trúc đều được cải thiện đáng kể
Qua mỗi lần cập nhật, họ cải tiến dần dần mà không phá vỡ khả năng tương thích, đồng thời cung cấp cảnh báo và shim để vẫn có thể duy trì phiên bản cũ
Việc PHP 6 bị hủy là do thay đổi trong xử lý chuỗi, và nhìn lại thì đó là một quyết định khôn ngoan
Đây là một dự án tôn trọng ngôn ngữ và cộng đồng đã nuôi sống nhiều người trong thời gian dài
Có thể viết phức tạp hơn, nhưng không nhất thiết phải như vậy
Giữa những năm 2000 tôi từng dùng các công cụ liên quan đến Zend, và nhớ là chúng khá khó nhằn
Nếu nắm PSR và chú ý đến bảo mật cũng như tính năng, nó đã trở thành một ngôn ngữ ổn định và mạnh mẽ hơn nhiều
Sự tiến hóa sau PHP 5 rất ấn tượng, nhưng đi kèm với đó là vấn đề độ phức tạp tăng lên
Với những người học từ các phiên bản cũ, codebase hiện đại có thể trở nên xa lạ và khó theo kịp
Đây là điểm mạnh với cộng đồng, nhưng lại là rào cản với những lập trình viên muốn quay lại
Tôi đã dùng C++ suốt 10 năm, nhưng giờ PHP còn dễ đọc hơn nhiều so với code C++ hiện đại
Cảm giác mục tiêu về sự đơn giản đã biến mất, và chỉ còn tính năng cứ liên tục chồng thêm lên
Lĩnh vực web thay đổi đặc biệt nhanh, nên nếu không theo kịp thì sẽ bị tụt lại
PHP đặc biệt là ngôn ngữ mà người mới bắt đầu thường dùng để làm website đầu tiên, nên cảm giác thay đổi có thể rõ hơn so với các ngôn ngữ khác
Nhiều người có xu hướng xấu hổ vì PHP, nhưng tôi thì không
Tôi không hiểu sâu về ngôn ngữ này, nhưng tôi biết có rất nhiều dự án tuyệt vời được xây bằng nó
Dự án PHP tôi thích nhất dạo này là BookStack, tôi dùng nó làm wiki cho gia đình
Vẫn có rất nhiều website được xây trên stack PHP được bảo trì tốt
Tôi đã dùng PHP trong production giai đoạn 2021~2023, và vấn đề khi đó không nằm ở bản thân ngôn ngữ mà ở codebase cũ kỹ và mức lương thấp
Có rất nhiều mã di sản từ thời PHP 4, và các mẫu truy cập dữ liệu cũng mỗi nơi một kiểu nên rất khó bảo trì
Nhưng khi migrate sang PHP 8 thì chất lượng code được cải thiện đáng kể
Nếu bắt đầu một dự án mới, có lẽ tôi sẽ không chọn PHP, nhưng với một dự án Laravel hiện đại thì tôi sẵn sàng tham gia
Chỉ là người mới rất dễ tiếp cận nó mà không có khái niệm về bảo mật, nên mới sinh ra nhiều vấn đề như SQL injection, và từ đó nó mang tiếng là ngôn ngữ “thiếu an toàn”
Khi dùng cùng các framework như Laravel, đây là một môi trường ổn định và trưởng thành hơn nhiều
Giống như chơi guitar hay làm thơ, ai cũng có thể làm, nhưng làm thật giỏi thì không dễ
Tôi học bằng cách xem trực tiếp code của nó, và rất thích thú với việc tự host máy chủ radio/nhạc
PHP là một ngôn ngữ càng cập nhật càng phức tạp
Nó vẫn là một ngôn ngữ chủ yếu xoay quanh web, nên tôi thấy lạ vì sao nó lại tiến hóa theo hướng này
Cuối cùng có vẻ như các ngôn ngữ hướng đối tượng truyền thống đang hội tụ về cùng một hướng
Dù là ngôn ngữ dành cho web thì vẫn có rất nhiều lý do để tiếp tục phát triển. Cải thiện trải nghiệm lập trình viên lúc nào cũng có giá trị
array_first(), array_last() thì hữu ích, nhưng toán tử pipe có thể làm hại khả năng bảo trì
Nó chỉ hỗ trợ hàm đơn nguyên, nên trong các hàm phức tạp còn có thể dễ gây bug hơn
Điều thú vị nhất trong công bố PHP 8.5 là độ ổn định và mức độ trưởng thành của ngôn ngữ này
Thật bất ngờ khi PHP bổ sung array_first, array_last, fatal error stack trace trước cả GTA6
Việc PHP liên tục thêm hàm mới và cú pháp mới sẽ làm tăng chi phí bảo trì về lâu dài
Xem ghi chú phát hành chính thức, có vài tính năng mà giá trị của chúng khá mơ hồ
parse_url()hiện cóGhi chú phát hành PHP 8.5 chính thức
Ví dụ về toán tử pipe trong hầu hết ngôn ngữ chỉ là cách lược bỏ phương pháp thông thường dùng biến tạm
Ví dụ parse URL cũng không được so sánh trực tiếp với
parse_url()parse_url()không hoàn toàn tuân theo tiêu chuẩn và xử lý URL tương đối kémHàm
uri()mới gọn gàng hơn, và nếu thêm khả năng áp dụng hàm từng phần thì chuỗi pipe sẽ còn dễ đọc hơn nữaTôi từng hay dùng dấu backtick (
) trong PHP CLI để gọishell_exec(), nhưng giờ nó đã bị deprecated Tôi thường viết kiểu nhưmkdir $dirname`Có nguy cơ bị chèn shell metacharacter, nên tốt hơn là dùng
mkdir()hoặcpcntl_exec()của PHP