2013-05-31 23 views
8

Có thể liên kết một cá thể với một đóng cửa tĩnh hay để tạo một kết thúc không tĩnh bên trong một phương thức lớp tĩnh không?Các trường hợp đối tượng ràng buộc với các bao đóng tĩnh

Đây là những gì tôi có nghĩa là ...

<?php 
class TestClass { 
    public static function testMethod() { 
     $testInstance = new TestClass(); 
     $testClosure = function() use ($testInstance) { 
      return $this === $testInstance; 
     }; 

     $bindedTestClosure = $testClosure->bindTo($testInstance); 

     call_user_func($bindedTestClosure); 
     // should be true 
    } 
} 

TestClass::testMethod(); 

Trả lời

3

PHP luôn ràng buộc phụ huynh thisscope để đóng mới được tạo. Sự khác biệt giữa một đóng cửa tĩnh và một đóng cửa không tĩnh là một đóng cửa tĩnh có scope (! = NULL) nhưng không phải this tại tạo thời gian. Đóng cửa "cấp cao nhất" không có this cũng không phải scope.

Vì vậy, người dùng phải loại bỏ phạm vi khi tạo kết thúc. May mắn thay, bindTo cho phép chính xác điều đó, ngay cả đối với các đóng cửa tĩnh:

$m=(new ReflectionMethod('TestClass','testMethod'))->getClosure()->bindTo(null,null); 
$m(); 
+0

Vì vậy, bạn đang nói rằng phạm vi thet (không phải ehich này đã được null) cần được loại bỏ để làm cho nó một đóng cửa không tĩnh? – andig

1

Hình như điều này có thể không thực hiện được, từ Closure::bindTo documentation

đóng cửa tĩnh không thể có bất kỳ ràng buộc đối tượng (giá trị của tham số newthis nên NULL), nhưng chức năng này vẫn có thể được sử dụng để thay đổi phạm vi lớp của chúng.

+1

Đó là quan điểm của tôi. Làm thế nào để bạn thực hiện một đóng cửa không tĩnh bên trong một phương pháp tĩnh? – Nathaniel

Các vấn đề liên quan