Nó sẽ thất bại khi bạn cố gắng gọi một phương pháp được bảo vệ hoặc riêng tư trên nó, bởi vì sử dụng nó theo cách đó được tính như gọi từ bên ngoài. Không có cách nào để làm việc xung quanh này trong 5,3 như xa như tôi biết, nhưng đến PHP 5.4, nó sẽ làm việc như mong đợi, out of the box:
class Hello {
private $message = "Hello world\n";
public function createClosure() {
return function() {
echo $this->message;
};
}
}
$hello = new Hello();
$helloPrinter = $hello->createClosure();
$helloPrinter(); // outputs "Hello world"
Thậm chí nhiều hơn, bạn sẽ có thể thay đổi những gì $ điều này dẫn đến khi chạy, cho các chức năng Anonymus (đóng cửa rebinding):
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(); // outputs "Bye world"
hiệu quả, chức năng Anonymus sẽ có một bindTo() method, nơi mà các tham số đầu tiên có thể được dùng để xác định những gì $ điểm này để, và các điều khiển tham số thứ hai mức hiển thị là. 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ó thể truy cập các thuộc tính công khai. Cũng lưu ý cách bindTo hoạt động, nó không sửa đổi chức năng ban đầu, nó trả về một cái mới.
Nguồn
2011-12-05 20:10:51
Quy ước diễn đàn phụ - thường tốt hơn là chấp nhận câu trả lời để chỉnh sửa câu hỏi để phản ánh câu trả lời ưa thích của bạn. Chủ yếu điều này là để phản ứng vẫn có ý nghĩa trong vĩnh cửu, nhưng cũng tất nhiên để cung cấp tín dụng cho một câu trả lời đúng. – halfer
Hãy coi chừng rằng '$ CI = $ this;' và '$ CI = & $ this;' ** không ** thực sự giống hệt nhau. Có thể vì mục đích của bạn, nhưng chúng không giống nhau. Hãy thử '$ CI = 'bla'; var_dump ($ this); 'với cả hai phiên bản để thấy sự khác biệt. – Rudie
@Rudie Tôi đang thêm [tài liệu] (http://php.net/manual/en/language.oop5.references.php) cho nhận xét của bạn – steampowered