PHP 8.5 bổ sung toán tử pipe (|>)
(thephp.foundation)- PHP 8.5 đã được chính thức bổ sung toán tử pipe (|>), cho phép thực hiện chuỗi theo phong cách lập trình hàm
- Toán tử pipe là cú pháp ngọt (syntax sugar) giúp truyền giá trị bên trái làm đối số cho callable phía phải, và cho phép viết pipeline chuyển đổi dữ liệu phức tạp một cách súc tích
- Những đoạn code trước đây cần lồng hàm hoặc tạo nhiều biến tạm giờ chuyển thành biểu thức chain có độ đọc cao, giúp tăng rõ rệt khả năng bảo trì và mức độ ứng dụng
- Được truyền cảm hứng từ các tính năng tương tự trong F#, OCaml, Elixir, và sau nhiều lần đề xuất, cải tiến trong nội bộ PHP, cuối cùng vào năm 2025 đã được chính thức triển khai
- Toán tử pipe dự kiến sẽ gắn chặt với các mở rộng theo hướng lập trình hàm như Partial Function Application (áp dụng hàm một phần), toán tử hợp thành hàm trong tương lai
- Trong PHP 8.5 (dự kiến tháng 11/2025), một thay đổi nhỏ nhưng có tiềm năng lớn mà cộng đồng đã lâu kêu gọi đã được bổ sung
- Dù triển khai khá đơn giản, đây là tính năng được đánh giá sẽ cải thiện đột biến khả năng biểu đạt của code
Toán tử pipe PHP 8.5 là gì?
- Toán tử pipe
|>là toán tử đơn giản dùng để truyền giá trị bên trái làm đối số cho hàm phía phải- Cú pháp này đơn giản hóa đầu vào tham số của hàm như một syntax sugar
- Ví dụ:
$result = "Hello World" |> strlen(...); // Dòng code phía trên tương đương ý nghĩa với dòng dưới đây $result = strlen("Hello World") - Có thể nối nhiều hàm (chain) để viết pipeline chuyển đổi dữ liệu theo từng dòng
$result = $arr |> fn($x) => array_column($x, 'tags') |> fn($x) => array_merge(...$x) |> array_unique(...) |> array_values(...); - Theo cách trước đây, sẽ rất bất tiện khi phải lồng nhau phức tạp hoặc khai báo nhiều biến tạm
- Toán tử này được thiết kế tương tự pipe (|) của shell Unix/Linux nên trực quan cao
Được đưa vào khi nào và lịch sử phát triển
- Đây là khái niệm tương tự pipe trong các ngôn ngữ hàm như F#, OCaml, Elixir
- Trong PHP cũng đã có nhiều thư viện cung cấp tính năng tương tự, nhưng gây ra các vấn đề về giảm hiệu năng và độ phức tạp
- Bắt nguồn từ Hack/HHVM (nhánh fork PHP của Facebook); trong PHP, đề xuất đầu tiên năm 2016 nhưng nhiều lần RFC đã bị bác bỏ
- Đến năm 2025, cuối cùng mới vượt qua làm cú pháp chuẩn, kết hợp với các tính năng đã triển khai trước đó như First Class Callables (cú pháp gọi hàm mảng)
Ví dụ sử dụng và đặc điểm
- Trong xử lý mảng phức tạp, xử lý chuỗi, xử lý stream dữ liệu... có thể kết nối hàm trực quan mà không cần biến tạm
- Việc chain còn có thể dùng được trong các ngữ cảnh cho phép chỉ một biểu thức duy nhất như
match(), giúp tối ưu hóa hơn nữa khả năng sử dụng code - Không chỉ có lời gọi hàm phía phải, mà có thể tận dụng các closure, hàm bậc cao được trả về, và nhiều mẫu dùng chung khác
Tăng cường mô hình lập trình hàm
- Pipe có thể kết hợp với mọi hàm, closure, hay hàm bậc cao
- Ví dụ: chain có điều kiện (Null-safe), Maybe Monad, xử lý stream... tương thích tự nhiên với các mẫu lập trình hàm đa dạng
- Với pipe +
maybe()như hàm bậc cao, pipeline an toàn với null cũng có thể hiện thực
Hướng phát triển tiếp theo
- Việc kết hợp với Partial Function Application (áp dụng hàm một phần) được lên kế hoạch, dự kiến mở rộng khả năng phối hợp hàm ngày càng đa dạng
- Toán tử hợp thành hàm (composition operator) cũng đang được đề xuất, giúp tối ưu hóa khi gom nhiều map ... thành một chain kết hợp cùng lúc
Toán tử pipe mang lại đổi mới về năng suất, độ đọc và khả năng mở rộng vượt xa một cú pháp bổ sung đơn thuần, và dự kiến sau PHP 8.5, việc viết code theo phong cách lập trình hàm sẽ mạnh mẽ hơn đáng kể.
6 bình luận
Mình vẫn chưa dùng...
Hay thật, ha ha. Tôi biết là hiện tại ở Python cũng vẫn đang tiếp tục có những cuộc thảo luận liên quan; hy vọng rằng một chức năng tương tự sẽ sớm được bổ sung.
PHP 8.5 (dự kiến vào tháng 11/2024) -> PHP 8.5 (dự kiến vào tháng 11/2025)
Từ một ngôn ngữ “thích - ghét”, PHP giờ đây đang dần trở thành ngôn ngữ đáng để suy ngẫm lại!
Hay quá... ghen ghê...
Xin hãy thêm cả vào ECMA nữa.~~~