Closure trong PHP là một hàm vô danh (anonymous function) có khả năng "đóng gói" (capture) các biến từ phạm vi bên ngoài tại thời điểm nó được định nghĩa.
👉 Nó là đối tượng của lớp
Closure
trong PHP, và được dùng rất phổ biến trong callback, xử lý mảng, hoặc lập trình hướng hàm (functional).
$greet = function($name) {
return "Chào $name";
};
echo $greet("Ngọc"); // Chào Ngọc
$greet
là closureuse
$prefix = "Chào";
$greet = function($name) use ($prefix) {
return "$prefix $name";
};
echo $greet("Long"); // Chào Long
use ($prefix)
giúp closure truy cập được biến ngoài scope⚠️ Biến
$prefix
được copy giá trị, không phải tham chiếu.
$count = 0;
$increment = function() use (&$count) {
$count++;
};
$increment();
$increment();
echo $count; // 2
&
để giữ liên kết (reference)Closure
$fn = function() {};
var_dump($fn instanceof Closure); // true
$arr = [1, 2, 3, 4];
$squared = array_map(function($item) {
return $item * $item;
}, $arr);
print_r($squared); // [1, 4, 9, 16]
class Calculator {
private $factor = 10;
public function getMultiplier() {
return function($value) {
return $value * $this->factor; // lỗi!
};
}
}
$calc = new Calculator();
$multiplier = $calc->getMultiplier();
bindTo()
:class Calculator {
private $factor = 10;
public function getMultiplier() {
return function($value) {
return $value * $this->factor;
}->bindTo($this, self::class); // closure gắn vào object hiện tại
}
}
Trường hợp | Closure có ích? |
---|---|
Viết callback gọn gàng | ✅ |
Gửi hành vi (function) làm tham số | ✅ |
Giao diện linh hoạt (filter, sort) | ✅ |
Thay thế cho create_function() cũ | ✅ |
Định nghĩa hàm tạm thời | ✅ |
Dùng như "stateful function" | ✅ |
Tính năng | Anonymous Function | Closure | Arrow Function (PHP 7.4+) |
---|---|---|---|
Không có tên | ✅ | ✅ | ✅ |
Capture biến ngoài | ✅ (dùng use ) | ✅ | ✅ (tự động capture) |
Dễ ghi nhớ | ✅ | ✅ | ✅ (rút gọn hơn) |
Là object Closure | ✅ | ✅ | ✅ |
$greet = function($name) {
return "Xin chào, $name!";
};
echo $greet("Ngọc"); // Xin chào, Ngọc!
use
)$prefix = "Chào";
$say = function($name) use ($prefix) {
return "$prefix $name!";
};
echo $say("Long"); // Chào Long!
🔥
use ($prefix)
là cách closure giữ lại giá trị của biến từ ngoài vào.
$square = fn($n) => $n * $n;
echo $square(4); // 16
use
)$prefix = "Hello";
$greet = fn($name) => "$prefix $name";
echo $greet("Ngọc"); // Hello Ngọc
Arrow function tự động hiểu
$prefix
bên ngoài scope – bạn không cần dùnguse()
.
Đặc điểm | Anonymous Function | Arrow Function (PHP 7.4+) |
---|---|---|
Hỗ trợ từ phiên bản | PHP 5.3+ | PHP 7.4+ |
Dài hơn nhưng linh hoạt hơn | ✅ | ❌ |
Ngắn gọn, giống JS lambda | ❌ | ✅ |
Truy cập biến ngoài scope | Phải dùng use() | Tự động capture |
Hỗ trợ nhiều dòng | ✅ (dùng {} ) | ❌ (chỉ 1 dòng expression) |