2012-02-25 36 views
9

Có thể truy cập các lớp/đối tượng được phân bổ là self, static$this trong gọi lại ẩn danh trong PHP không? Chỉ cần như thế này:

class Foo { 
    const BAZ = 5; 
    public static function bar() { 
     echo self::BAZ; // it works OK 
     array_filter(array(1,3,5), function($number) /* use(self) */ { 
      return $number !== self::BAZ; // I cannot access self from here 
     }); 
    } 
} 

Có cách nào để ứng dụng hoạt động như với các biến thông thường, sử dụng mệnh đề use(self) không?

+1

Kể từ PHP 5.4, bạn có thể sử dụng $ this. –

+0

* (liên quan) * [PHP 5.4 - 'đóng $ hỗ trợ này'] (http://stackoverflow.com/questions/5734011/php-5-4-closure-this-support/5734109#5734109) – Gordon

Trả lời

13

Với PHP5.4 nó sẽ được. Bây giờ nó không thể. Tuy nhiên, nếu bạn chỉ cần truy cập vào tài sản công cộng, phương pháp

$that = $this; 
function() use ($that) { echo $that->doSomething(); } 

Đối với các hằng số không có lý do gì để không sử dụng tên có trình độ

function() { echo Classname::FOO; } 
+1

Cảm ơn câu trả lời. Tuy nhiên, không thể sử dụng Classname nếu tôi cần thay thế static :: FOO, tức là ràng buộc trễ. –

+1

Âm thanh bạn đang tìm kiếm các thuộc tính lớp (còn gọi là các thuộc tính tĩnh), hơn các hằng số. Tuy nhiên, với ví dụ đầu tiên trong câu trả lời của tôi, bạn có thể gọi hằng số như '$ that :: FOO'. – KingCrunch

+0

Thực ra, tôi nghĩ để làm những gì OP muốn với sự ràng buộc trễ nó sẽ không là: $ that = static :: FOO; –

4

Chỉ cần sử dụng cách tiêu chuẩn:

Foo::BAZ; 

hoặc

$baz = self::BAZ; 
... function($number) use($baz) { 
    $baz; 
} 
0

gì về điều này:

class Foo { 
    const BAZ = 5; 
    $self = __class__; 
    public static function bar() { 
     echo self::BAZ; // it works OK 
     array_filter(array(1,3,5), function($number) use($self) { 
      return $number !== $self::BAZ; // access to self, just your const must be public 
     }); 
    } 
} 
Các vấn đề liên quan