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á.
Ủng hộ Chung Nguyễn Blog
Chung Nguyễn Blog sử dụng FlashPanel - Dịch vụ quản trị máy chủ chuyên nghiệp để quản lý VPS
#FlashPanel là dịch vụ cloud panel trên nền tảng web hỗ trợ khách hàng:
- * Quản lý máy chủ số lượng nhiều
- * Không có kinh nghiệm quản lý máy chủ
- * Thích sử dụng giao diện web đơn giản, trực quan hơn terminal
- * Quá nhàm chán với việc ghi nhớ và lặp lại việc gõ các câu lệnh
- * Muốn tự động hóa mọi thao tác
- * Muốn tiết kiệm thời gian quản trị máy chủ
- * Muốn tiết kiệm tiền bạc, nhân lực quản trị máy chủ 👉 https://flashpanel.io
Các bài viết trên website thường xuyên được đăng tải và cập nhật trên trang Facebook Chung Nguyễn Blog hãy tặng cho Chung một LIKE nhé! Mãi yêu các bạn!
813 👍Đánh giá bài viết

Bình luận