Closure trong PHP là một kiểu hàm ẩn danh (anonymous function), có khả năng nắm giữ (capture) các biến từ phạm vi bên ngoài tại thời điểm nó được định nghĩa. Điều này giúp Closure có thể truy cập và sử dụng các giá trị bên ngoài, ngay cả khi được gọi ở một phạm vi khác.
Closure được sử dụng rộng rãi để tạo ra các hàm linh hoạt, có thể truyền như một đối số (callback) cho các hàm khác, hoặc trả về từ các hàm, giúp viết code gọn gàng và dễ bảo trì.
Closure được khai báo bằng từ khóa function
mà không cần đặt tên hàm. Bạn có thể gán nó cho một biến, hoặc truyền trực tiếp làm tham số cho hàm khác.
Ví dụ:
$message = "Xin chào";
$greet = function($name) use ($message) {
return $message . ", " . $name;
};
echo $greet("Nam"); // Kết quả: Xin chào, Nam
Trong ví dụ này, biến
$message
được nắm giữ từ phạm vi bên ngoài và được Closure sử dụng bên trong nội dung hàm. Từ khóause
cho phép truyền biến bên ngoài vào Closure.
array_filter
)Closure thường được dùng như một hàm callback, giúp xử lý các phần tử mảng hoặc chuỗi.
Ví dụ:
$numbers = [1, 2, 3, 4, 5, 6];
$evenNumbers = array_filter($numbers, function($num) {
return $num % 2 === 0;
});
print_r($evenNumbers); // Kết quả: [2, 4, 6]
Closure cũng có thể được trả về từ một phương thức của class, đồng thời nắm giữ các thuộc tính của đối tượng (thông qua $this
).
Ví dụ:
class Greeting {
private $message = "Hello";
public function getGreeting() {
return function($name) {
return $this->message . ", " . $name;
};
}
}
$greet = (new Greeting())->getGreeting();
echo $greet("Em"); // Kết quả: Hello, Em
Trong ví dụ trên, Closure truy cập được thuộc tính $message
của class thông qua $this
.
✅ Cho phép định nghĩa các hàm ngắn gọn mà không cần đặt tên
✅ Dễ dàng truyền hoặc trả về các logic tùy biến
✅ Có thể nắm giữ (capture) biến từ phạm vi bên ngoài
✅ Phù hợp với các callback, các hàm xử lý bậc cao, lập trình hàm (functional programming)
Closure là một tính năng mạnh mẽ của PHP, giúp bạn xây dựng các đoạn mã ngắn gọn, linh hoạt và dễ bảo trì hơn. Khả năng nắm giữ biến bên ngoài khiến Closure đặc biệt hữu ích trong các tình huống cần truyền hàm làm tham số, hoặc khi làm việc với lập trình hướng đối tượng và lập trình hàm.