Nó sẽ không thành công khi bạn cố gắng gọi một phương thức được bảo vệ hoặc riêng tư trên nó, bởi vì sử dụng nó theo cách đó được coi là gọi từ bên ngoài. Không có cách nào để giải quyết vấn đề này trong 5.3 theo như tôi biết, nhưng đến với PHP 5.4, nó sẽ hoạt động như mong đợi:
class Hello {
private $message = "Hello world\n";
public function createClosure() {
return function() {
echo $this->message;
};
}
}
$hello = new Hello();
$helloPrinter = $hello->createClosure();
$helloPrinter();
Thậm chí nhiều hơn nữa, bạn sẽ có thể thay đổi $ mà điểm này trỏ đến trong thời gian chạy, đối với các hàm ẩn danh (đóng lại):
class Hello {
private $message = "Hello world\n";
public function createClosure() {
return function() {
echo $this->message;
};
}
}
class Bye {
private $message = "Bye world\n";
}
$hello = new Hello();
$helloPrinter = $hello->createClosure();
$bye = new Bye();
$byePrinter = $helloPrinter->bindTo($bye, $bye);
$byePrinter();
Một cách hiệu quả, các hàm ẩn danh sẽ có phương thức bindTo () , nơi tham số đầu tiên có thể được sử dụng để chỉ định $ mà điểm này trỏ tới và tham số thứ hai kiểm soát mức độ hiển thị . Nếu bạn bỏ qua tham số thứ hai, khả năng hiển thị sẽ giống như gọi từ "bên ngoài", ví dụ. chỉ các thuộc tính công cộng mới có thể được truy cập. Ngoài ra, hãy lưu ý về cách bindTo hoạt động, nó không sửa đổi chức năng ban đầu mà trả về một chức năng mới .