algolia search

Tìm thấy x bài viết trong xms.

Partial Function Application (PFA) trong PHP 8.6


PHP 8.6 (dự kiến) mang đến một tính năng rất đáng chú ý: Partial Function Application (PFA).
Mục tiêu của PFA là giảm boilerplate khi viết callback, giúp code ngắn gọn, rõ ý định hơn và thân thiện với phong cách functional.

1. Partial Function Application là gì?

Partial Function Application cho phép bạn gọi hàm nhưng chưa truyền đủ tham số.
Thay vì thực thi ngay, PHP sẽ trả về một Closure để bạn gọi sau.

PHP 8.6 giới thiệu hai loại placeholder:

Ký hiệu Ý nghĩa
`? Chừa đúng 1 tham số
... Chừa toàn bộ các tham số còn lại

2. Ví dụ cơ bản

function add4(int $a, int $b, int $c, int $d): int {
    return $a + $b + $c + $d;
}

$f = add4(1, ?, 3, 4);
echo $f(2); // 10

Tương đương với:

$f = fn (int $b) => add4(1, $b, 3, 4);

📌 ? đại diện cho tham số sẽ được truyền ở lần gọi sau.

3. Chừa nhiều tham số

$f = add4(1, ?, 3, ?);
echo $f(5, 7); // 16

Tương đương:

fn (int $b, int $d) => add4(1, $b, 3, $d);

➡️ Thứ tự xuất hiện của ? quyết định thứ tự tham số của closure.

4. Placeholder ... – nhận toàn bộ phần còn lại

$f = add4(1, ...);
echo $f(2, 3, 4); // 10

Tương đương:

fn (int $b, int $c, int $d) => add4(1, $b, $c, $d);

📌 ... dùng để forward toàn bộ các tham số chưa được truyền.

5. Callback gọn gàng hơn rất nhiều

Trước đây (dài dòng)

array_map(
    fn (string $s): string => str_replace('hello', 'hi', $s),
    $strings
);

Với PFA

array_map(
    str_replace('hello', 'hi', ?),
    $strings
);

✔ Không cần arrow function
✔ Rõ ràng ý định xử lý dữ liệu

6. Kết hợp tốt với Pipe Operator (|>)

$data
  |> array_map(strtoupper(...), ?)
  |> array_filter(?, is_numeric(...));

📌 Pipe operator cần callable một tham số — PFA tạo callable đó cực kỳ gọn.

7. Named arguments & thứ tự tham số

function stuff(int $i, string $s, float $f, Point $p, int $m = 0): string {}

$c = stuff(
    s: ?,
    i: ?,
    p: ?,
    f: 3.5
);

➡️ Thứ tự tham số của closure theo placeholder, không phụ thuộc thứ tự khai báo hàm.

8. Hỗ trợ variadic function

function things(int $i, ?float $f = null, Point ...$points) {}

$c = things(1, 3.14, ...);
// Closure nhận (Point ...$points)

Hoặc ép số lượng tham số cụ thể:

$c = things(?, ?, ?, ?);
// Closure nhận đủ từng tham số

9. Thunk – trì hoãn thực thi

$thunk = expensive(3, 4, $pt, ...);

// Thực thi sau
$result = $thunk();

💡 Hữu ích cho lazy evaluation hoặc các tác vụ nặng.

10. Hạn chế quan trọng

Không thể áp dụng PFA cho constructor

new Widget(?, 10); // Lỗi compile

✅ Giải pháp: dùng factory hoặc static method

Widget::make(?, size: 10);

11. Ví dụ thực tế

function addHeader(array $req, string $name, string $value): array {
    $req['headers'][$name] = $value;
    return $req;
}

$withAuth = addHeader(
    ?,
    'Authorization',
    'Bearer TOKEN'
);

$request = $withAuth($request);

📌 Rất phù hợp cho:

  • Pipeline xử lý request
  • Middleware-style
  • Functional programming trong PHP

12. Tổng kết

Partial Function Application trong PHP 8.6 giúp bạn:

  • ✅ Viết callback ngắn gọn, dễ đọc
  • ✅ Giảm boilerplate arrow function
  • ✅ Kết hợp tốt với array_*, pipe, Collection
  • ✅ Phong cách functional rõ ràng hơn nhưng vẫn “chuẩn PHP”

👉 Nếu bạn thường xuyên dùng Laravel Collection, Pipeline hoặc functional JS, PFA là một nâng cấp cực kỳ đáng giá.

Đánh giá bài viết

Thích thì like
Partial Function Application (PFA) trong PHP 8.6
0/5 0 votes

Bình luận

Hiển thị bình luận Facebook