Closure trong PHP là gì?

Closure trong PHP là một hàm ẩn danh (anonymous function), có thể giữ các biến từ phạm vi bên ngoài khi nó được định nghĩa. Nó thường được sử dụng để tạo ra các hàm linh hoạt, có thể dùng làm callback hoặc truyền vào các hàm khác như một giá trị.


Cú pháp cơ bản của Closure

Closure được tạo ra bằng cách sử dụng từ khóa function mà không cần tên hàm.

Ví dụ:

$greet = function($name) {
    return "Hello, " . $name;
};

echo $greet("Anh");

Trong ví dụ trên, biến $greet là một closure và được gọi như một hàm thông thường.


Sử dụng use trong Closure

Closure có thể “nắm giữ” các biến từ phạm vi bên ngoài của nó thông qua từ khóa use.

Cách sử dụng use

$message = "Chào em";

$greet = function($name) use ($message) {
    return $message . ", " . $name;
};

echo $greet("Anh");

Ở đây, biến $message được nắm giữ từ bên ngoài closure và sử dụng trong hàm.


Ứng dụng của Closure trong PHP

Closure trong Callback với array_filter

Closure rất hữu ích khi sử dụng trong các hàm như array_filter để lọc các phần tử của mảng.

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 bên trong Lớp (Class)

Closure có thể được sử dụng trong các lớp (class) để truy cập các thuộc tính của đối tượng.

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ụ này, closure nắm giữ thuộc tính $message của đối tượng lớp Greeting.


Kết luận

Closure trong PHP mang lại sự linh hoạt và mạnh mẽ khi bạn cần tạo các hàm ẩn danh, callback, hoặc khi làm việc với các hàm bậc cao. Nó cho phép bạn giữ các biến từ phạm vi bên ngoài và sử dụng chúng trong hàm. Điều này giúp viết mã ngắn gọn hơn và tối ưu hơn trong nhiều trường hợp.