2 điểm bởi GN⁺ 2025-11-21 | 1 bình luận | Chia sẻ qua WhatsApp
  • 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ẩncá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ạng clone($this, ['title' => $title])
    • Tuy nhiên, khi sao chép thuộc tính readonly từ bên ngoài thì cần chỉ định truy cập public(set)
  • Bổ sung thuộc tính #[NoDiscard]é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à static và không thể truy cập biến bên ngoài
  • 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()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()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ớp Uri\Rfc3986\Uri
    • Giúp đơn giản hóa việc thao tác và phân tích URI

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á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_FAILURE khi gọi filter_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ử pipetrì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

 
GN⁺ 2025-11-21
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

    • Tôi nghĩ PHP là một ví dụ tiêu biểu về việc thực hiện chuyển đổi quy mô lớn một cách đúng đắn
      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
    • Nhiều người nói PHP đã trở nên phức tạp hơn, nhưng đoạn code đơn giản tôi viết bằng PHP 5.3 vẫn chạy hoàn hảo trên PHP 8
      Có thể viết phức tạp hơn, nhưng không nhất thiết phải như vậy
    • Không biết phần mềm mã hóa đó có phải là Zend không
      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
    • PHP 8 hoàn toàn đủ dễ hiểu nếu được học đúng cách ngay từ đầu
      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 vẫn thấy PHP hiện đại là một ngôn ngữ dễ đọc
      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
    • Chỉ cần học PHP 8 là đủ. PHP bây giờ tốt hơn ngày xưa rất nhiều
    • Dạo này phần lớn phần mềm đều gặp vấn đề tương tự
      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
    • Thực ra các ngôn ngữ khác cũng vậy
      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
    • Dù làm việc như một chuyên gia Java, tôi vẫn thường xuyên phải giải thích các tính năng mới cho đồng nghiệp
      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

    • PHP hiện đại là một ngôn ngữ nhanh và rất 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ỹ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
    • PHP là một ngôn ngữ trực quan và thú vị khi làm việc cùng
      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”
    • Tôi thích backend PHP hơn JS/TS + framework hiện đại
      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
    • Tôi đã xây dựng sự nghiệp với PHP, và đến giờ vẫn đang tận hưởng quá trình hiện đại hóa của nó
      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 thích AzuraCast
      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

    • C# và Java cũng trở nên phức tạp hơn dù chủ yếu dùng cho backend web
      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
    • Bản thân web giờ cũng không còn đơn giản nữa
    • Cũng có những dự án như NativePhp
      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ị
    • Ban đầu tôi chỉ trích mà chưa đọc bài, nhưng xem lại thì một số tính năng cũng ổn
      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

    • Đây là những bổ sung tốt, nhưng thật ra dùng array_shift hay array_pop cũng đã đủ rồi
  • 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ồ

    • Mở rộng URI nhanh hơn, nhưng bị trùng lặp với parse_url() hiện có
    • Toán tử pipe là vấn đề sở thích, và có thể làm hỏng tính nhất quán về style code
    • Cải tiến clone chỉ là thay đổi rất nhỏ
    • #Discard/void thay thế chức năng vốn thuộc về static analyzer
    • Closure trong hằng số thì thú vị, nhưng có thể dẫn tới các thuộc tính (#attribute) phức tạp hơn
    • cURL persistent handles mới là yếu tố cải thiện hiệu năng thực sự
    • array_first() chỉ ở mức cú pháp đường, có lẽ sẽ hiếm khi được dùng trong các dự án lớn
  • 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ém
      Hà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ữa
  • Tôi từng hay dùng dấu backtick () trong PHP CLI để gọi shell_exec(), nhưng giờ nó đã bị deprecated Tôi thường viết kiểu như mkdir $dirname`

    • Đó là một anti-pattern về bảo mật
      Có nguy cơ bị chèn shell metacharacter, nên tốt hơn là dùng mkdir() hoặc pcntl_exec() của PHP