Trong PHP, một closure là một hàm ẩn danh có quyền truy cập vào các biến trong phạm vi mà nó được tạo ra, ngay cả khi phạm vi đó đã đóng. Bạn cần chỉ định từ khóa use trong đó.
Closures là các đối tượng đóng gói mã hàm và phạm vi mà chúng được tạo ra. Với PHP 7, một phương thức mới closure::call() đã được giới thiệu để liên kết phạm vi đối tượng với một closure và gọi nó.
Lớp Closure có các phương thức sau, bao gồm phương thức call() −
final class Closure { /* Methods */ private __construct() public static bind(Closure $closure, ?object $newThis, object|string|null $newScope = "static"): ?Closure public bindTo(?object $newThis, object|string|null $newScope = "static"): ?Closure public call(object $newThis, mixed ...$args): mixed public static fromCallable(callable $callback): Closure }
call() method là một phương thức tĩnh của lớp Closure. Nó được giới thiệu như một cách rút gọn cho các phương thức bind() hoặc bindTo().
bind() method sao chép một closure với một đối tượng ràng buộc cụ thể và phạm vi lớp, trong khi phương thức bindTo() sao chép closure với một đối tượng ràng buộc mới và phạm vi lớp mới.
Phương thức call() có các signature sau đây −
public Closure::call(object $newThis, mixed ...$args): mixed
Phương thức call() tạm thời liên kết closure với newThis và gọi nó với bất kỳ tham số nào được cung cấp.
Với phiên bản trước PHP 7, phương thức bindTo() có thể được sử dụng như sau −
<?php class A { private $x = 1; } // Define a closure Pre PHP 7 code $getValue = function() { return $this->x; }; // Bind a clousure $value = $getValue->bindTo(new A, 'A'); print($value()); ?>
Chương trình liên kết $getValue là một đối tượng closure với đối tượng của lớp A và in giá trị của biến riêng tư $x – nó là 1.
Với PHP 7, việc ràng buộc được thực hiện qua phương thức call() như được trình bày dưới đây −
<?php class A { private $x = 1; } // PHP 7+ code, Define $value = function() { return $this->x; }; print($value->call(new A)); ?>