2011-08-18 35 views
20

Sử dụng chức năng sau:Xác định, nếu một biến là một đóng cửa có giá trị trong PHP

function is_closure($t) { return (!is_string($t) && is_callable($t)); }

Can trở lại này đúng đối với bất cứ điều gì khác, hơn một chức năng đóng cửa vô danh? Nếu có, thì cách nào để xác định chính xác, nếu biến là đóng cửa?

Rất cám ơn

+2

Đối tượng cũng có thể gọi nếu chúng triển khai ['__invoke'] (http://www.php.net/manual/en/language.oop5.magic.php#language.oop5.magic.invoke). – mario

Trả lời

40

Cách xác định nhất để kiểm tra xem hàm hồi quy là một đóng cửa thực tế là:

function is_closure($t) { 
    return is_object($t) && ($t instanceof Closure); 
} 

Tất cả các chức năng ẩn danh được biểu diễn dưới dạng các đối tượng của loại Closure trong PHP. (Trong đó, quay lại nhận xét ở trên, xảy ra để triển khai phương pháp __invoke().)

+4

Thứ gì đó đã vướng phải tôi trong một hoặc hai phút ... Nếu mã của bạn bị đặt tên, hãy chắc chắn thoát khỏi \ Closure để quay lại không gian tên chung. – Jim

+7

Bạn không cần phải làm 'is_object ($ t)', làm 'instanceof' cho một đối tượng không sẽ luôn trả về false. –

13

Tôi nghĩ bạn có thể sử dụng instanceof Closure cho biết điều này không nên dựa vào. Tôi đoán nó hoạt động cho bây giờ.

Chức năng ẩn danh hiện được triển khai bằng cách sử dụng lớp Đóng. Đây là chi tiết triển khai và không nên dựa vào.

Cập nhật Các Đóng manual page đã cập nhật hướng dẫn của nó về vấn đề này. Dường như hành vi này bây giờ có thể được dựa vào.

Chức năng ẩn danh, được thực hiện trong PHP 5.3, đối tượng lợi nhuận thuộc loại này. Thực tế này được sử dụng để được coi là một chi tiết thực hiện, nhưng bây giờ nó có thể được dựa vào.

+0

@mario đánh tôi với nó nhưng tôi sẽ để lại điều này ở đây để biết thêm thông tin (trừ khi Mario muốn hợp nhất điều này với câu trả lời của anh ấy) – Phil

2

php.net gợi ý sử dụng phản xạ để tìm ra nếu biến chứa một kết thúc hợp lệ hay không

tôi sử dụng helper này ít

function isClosure($suspected_closure) { 
    $reflection = new ReflectionFunction($suspected_closure); 

    return (bool) $reflection->isClosure(); 
} 
0

Nếu bạn gặp lỗi về điều đó không tồn tại ReflectionFunction, hãy sử dụng dấu gạch chéo ngược trước lớp:

// Closure 
$closure = function() {}; 
$reflection = new \ReflectionFunction($closure); 
// checkout if it is a closure 
$test->isTrue($reflection->isClosure()); 
Các vấn đề liên quan