Closure trong PHP là gì?

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).


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

$greet = function($name) {
    return "Chào $name";
};

echo $greet("Ngọc"); // Chào Ngọc
  • $greetclosure
  • Nó là anonymous functioncó thể truyền như một biến

🧠 Capture biến bên ngoài với use

$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.


🔁 Capture theo tham chiếu

$count = 0;

$increment = function() use (&$count) {
    $count++;
};

$increment();
$increment();

echo $count; // 2
  • Dùng & để giữ liên kết (reference)

🧪 Closure là đối tượng Closure

$fn = function() {};
var_dump($fn instanceof Closure); // true

🧩 Closure trong callback (ví dụ thực tế)

$arr = [1, 2, 3, 4];

$squared = array_map(function($item) {
    return $item * $item;
}, $arr);

print_r($squared); // [1, 4, 9, 16]

📌 Closure dùng trong class (từ PHP 5.3)

class Calculator {
    private $factor = 10;

    public function getMultiplier() {
        return function($value) {
            return $value * $this->factor; // lỗi!
        };
    }
}

$calc = new Calculator();
$multiplier = $calc->getMultiplier();

🚨 Sửa bằng 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
    }
}

Khi nào dùng Closure trong PHP?

Trường hợpClosure 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()
Định nghĩa hàm tạm thời
Dùng như "stateful function"

🧠 Tóm tắt

Tính năngAnonymous FunctionClosureArrow 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

🧩 1. Anonymous Function (Hàm vô danh)

✅ Cú pháp cơ bản:

$greet = function($name) {
    return "Xin chào, $name!";
};

echo $greet("Ngọc"); // Xin chào, Ngọc!

✅ Closure dùng biến bên ngoài (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.


🧩 2. Arrow Function (PHP 7.4+)

✅ Cú pháp ngắn gọn:

$square = fn($n) => $n * $n;
echo $square(4); // 16

✅ Tự động capture biến từ ngoài scope (giống 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ùng use().


📌 So sánh: Anonymous Function vs Arrow Function

Đặc điểmAnonymous FunctionArrow Function (PHP 7.4+)
Hỗ trợ từ phiên bảnPHP 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 scopePhải dùng use()Tự động capture
Hỗ trợ nhiều dòng✅ (dùng {})❌ (chỉ 1 dòng expression)