PHP 8.5 có gì mới anh em? Làm quen với Pipe chút nhé

PHP 8.5 mang đến cho chúng ta một luồng gió mới lạ, một tính năng mới cực kỳ thú vị cho ae chiến PHP: toán tử pipe (|>). Nghe qua thì giống kiểu bên functional programming nhỉ? Chính xác! PHP ngày càng “hữu dụng” hơn, và toán tử pipe là bước tiến giúp code PHP trở nên được sạch, gọn và dễ đọc hơn. Nếu bạn đã từng quẩy array_map, array_filter hoặc collect() bên Laravel, bạn sẽ thấy |> rất thân thiện đấy.

Cùng tìm hiểu về toán tử Pipe trong PHP 8.5

Toán tử pipe (|>) cho phép bạn truyền kết quả của một biểu thức làm đối số đầu tiên của một hàm khác, theo đúng kiểu “pipeline” – dữ liệu đi qua một chuỗi các hàm xử lý.

Pipe thay thế việc phải lồng hàng đống hàm vào nhau, giúp code linear hơn, dễ đọc hơn.

Cú pháp

$giá_trị |> function($tham_số) {
    // xử lý gì đó
};

Hay là như thế này

$value = "Chào em!";

$result = $value
    |> function3(...)
    |> function2(...)
    |> function1(...);

Tại sao chúng ta lại cần có Pipe?

Hãy xem một ví dụ kinh điển kiểu spaghetti code (hằm bà lằm các thứ):

$result = strtolower(trim(htmlspecialchars($_GET['input'])));

hoặc là kiểu này nhìn quen không anh em? Chứ tôi là tôi thấy giống 99% là code của tôi rồi á.

$value = "hello world";
$result1 = function3($value);
$result2 = function2($result1);
$result = function1($result2);

Ngày nay với pipe, anh em không cần phải khổ như thế nữa:

$result = $_GET['input']
    |> htmlspecialchars($$)
    |> trim($$)
    |> strtolower($$);

Dòng nào ra dòng nấy, rõ ràng như đan rổ. Không còn phải đọc từ trong ra ngoài như mấy bài toán lớp 5 nữa nha.

Lưu ý: $$ là placeholder cho giá trị được truyền pipe vào.

Cách dùng Pipe

Giả sử ví dụ đơn giản bạn đang muốn xử lý một chuỗi đầu vào của người dùng và muốn “dọn rác” trước khi lưu:

Bình thường thì code như thế này:

$clean = ucfirst(strtolower(trim(strip_tags($input))));

Nhưng mà có pipe vào phát là khác bọt liền:

$clean = $input
    |> strip_tags($$)
    |> trim($$)
    |> strtolower($$)
    |> ucfirst($$);

Bạn thấy không? Cấu trúc “pipeline” này cực kỳ phù hợp với các bước xử lý tuần tự, đặc biệt là data transformation – thứ mà dân backend chúng mình làm suốt ngày. Nhiều khi đọc code của ông kế bên muốn tá hoả luôn á!

Kết hợp với Arrow Function

PHP 8.5 cũng cho phép dùng pipe với anonymous function:

$result = $data
    |> fn($x) => array_filter($x, fn($v) => $v > 10)
    |> fn($x) => array_map(fn($v) => $v * 2, $x);

Đỉnh thật chứ! Không cần viết thành biến trung gian hay lồng nhau ngoằn ngoèo nữa rồi anh em ơi.

Một số điểm cần lưu ý:

  • |> chỉ truyền giá trị làm tham số đầu tiên. Nếu hàm cần nhiều tham số thì bạn phải xử lý lại, ví dụ dùng arrow function.
  • $$ là placeholder trong hàm pipe để ám chỉ “cái giá trị đang được pipe tới”. Nếu không có $$, PHP sẽ hiểu là gọi hàm như bình thường.
  • Đây không phải là operator overload hay magic gì cả – chỉ là cú pháp sugar để code dễ thở hơn thôi.

Tổng kết lại thì

Toán tử pipe trong PHP 8.5 là một cú “lột xác nhẹ” giúp anh em coder viết code gọn gàng – dễ đọc – dễ bảo trì hơn. Không phải hack trick, không phải package bên ngoài, đây là hàng chính chủ từ core PHP.

Nếu bạn là người thích lập trình theo kiểu functional, hoặc đơn giản là thấy mệt mỏi với các chuỗi hàm lồng nhau như cái bánh đa nem thì |> là thứ bạn nên thử ngay hôm nay.

TL;DR: |> giúp truyền giá trị qua chuỗi các hàm mà không phải lồng. Rất hữu dụng khi xử lý dữ liệu dạng pipeline. Dễ đọc, sạch sẽ, ngon nghẻ!