2010-08-31 32 views
17

Một đóng cửa php hoặc chức năng ẩn danh được sử dụng để tạo ra chức năng mà không chỉ định tên của nó.Tạo và gọi một chức năng ẩn danh trong một câu lệnh đơn

Có thể gọi chúng mà không được chỉ định cho số nhận dạng như chúng tôi làm trong JavaScript không? ví dụ:

(function(){ 
    echo('anonymous function'); 
})(); 

Cách sử dụng chính xác của use xây dựng trong khi xác định chức năng ẩn danh và trạng thái của chức năng ẩn danh trong phương thức công khai với khả năng truy cập tài sản cá nhân là gì?

$anon_func = 
function($my_param) use($this->object_property){ //use of $this is erroneous here 
    echo('anonymous function'); 
}; 
+4

Một đóng cửa là không hoàn toàn đồng nghĩa với một chức năng ẩn danh, mặc dù các hàm ẩn danh trong PHP là kiểu 'Closure'. Chỉ để bạn biết. – BoltClock

+0

Lỗi chính xác khi bạn thử ví dụ mã thứ hai của mình là gì? 'sai' là một chút không xác định. – BoltClock

+0

Không thể sử dụng $ this như biến lexical –

Trả lời

11

Có thể gọi cho chúng mà không cần gán cho số nhận dạng giống như chúng tôi làm trong JavaScript? ví dụ.

Không có trong PHP 5.x; trừ khi bạn đếm nó khi phương thức của bạn nhận một cuộc gọi lại làm đối số. ví dụ:

$square = array_map(function ($v) { return $v*$v; }, $array); 

là gì việc sử dụng đúng đắn về sử dụng xây dựng trong khi xác định vô danh chức năng

Từ khóa use chỉ ra mà biến từ phạm vi từ vựng hiện tại nên được nhập khẩu vào việc đóng cửa. Bạn thậm chí có thể vượt qua chúng bằng cách tham khảo và thay đổi biến được thông qua, ví dụ:

$total = 0; 
array_walk($array, function ($v) use (&$total) { $total += $v; }); 
// $total is now the sum of elements in $array 

tình trạng của chức năng ẩn danh trong phương pháp công cộng với năng tiếp cận với tài sản riêng là gì?

đóng cửa được xác định bên trong một lớp có thể truy cập vào tất cả các thuộc tính và phương thức của nó, bao gồm cả những tin mà không cần phải nhập khẩu $this thông qua từ khóa use trong PHP 5.4:

// this works fine in PHP 5.4 
$anon_func = 
function($my_param) { 
    $thing = $my_param + $this->object_property; 
    echo('anonymous function'); 
}; 

Lưu ý rằng đối với một số lý do kỳ lạ hỗ trợ cho $this trong đóng cửa was removed in PHP 5.3. Trong phiên bản này, bạn có thể làm việc xung quanh hạn chế này sử dụng một cái gì đó như:

// a workaround for PHP 5.3 
$temp = $this; 

$anon_func = 
function($my_param) use ($temp) { 
    $thing = $my_param + $temp->object_property; 
    echo('anonymous function'); 
}; 

Nhưng điều này mang đến cho bạn truy cập vào chỉ các thành viên công cộng, cố gắng truy cập các thành viên tư nhân vẫn sẽ cung cấp cho bạn một lỗi.

Cũng lưu ý rằng cố gắng nhập $this (qua use), bất kể phiên bản PHP, sẽ dẫn đến lỗi nghiêm trọng Cannot use $this as lexical variable.

+3

+1 Không thể tự gọi các hàm ẩn danh như '(function() {})();' trong PHP mặc dù, có lẽ vì cùng lý do mảng dereferencing vẫn chưa thể thực hiện được như ghi chú Marc B. – BoltClock

+0

@BoltClock Ngắt kết nối mảng BTW (ví dụ: 'hàm foo() {return $ someArray;}', '$ var = foo() ['bar']') hoạt động trong PHP 5.4 cũng như – NullUserException

3

Không giống như nó, như họ vẫn phải được khai báo với function() {} ký hiệu, và trên 5.3.2 của tôi cài đặt, cố gắng khái niệm mẫu của bạn trả về một lỗi unexpected '(' cú pháp. Các doc page trên bao đóng cũng không đề cập đến nó.

Có thể nó sẽ trở thành có thể khi họ vá phân tích cú pháp để cho phép somefunction()[2] bỏ qua mảng.

+1

Dereferencing mảng đã được thêm vào [PHP 5.4] (http://www.php.net/manual/en/migration54.new-features.php), nhưng bạn vẫn không thể gọi các chức năng ẩn danh ngay sau tờ khai. – NullUserException

19
call_user_func(function() use(closure-vars){ ... }); 
+0

OP làm cho thuộc tính lớp như thế nào có thể truy cập vào việc đóng cửa? –

+0

Các op có thể tạo ra một tham chiếu của đối tượng để vượt qua để đóng cửa thông qua các tuyên bố sử dụng, tức là: $ obj = $ này; call_user_func (function() sử dụng ($ obj) {}). Bằng cách đó, anh ta có quyền truy cập vào các thuộc tính và phương thức của lớp bên trong bao đóng. Bit của một hack nhưng nó là tốt nhất chúng tôi có cho đến khi PHP 5,4 đến. – Jeremy

15

PHP 7 đã thêm khả năng thực hiện việc này.

Mã này:

(function() { echo "This works as expected in PHP 7.\n"; })(); 

tác phẩm như người ta mong đợi trong PHP 7. (Nó vẫn không hoạt động trong bất kỳ phiên bản PHP 5.x.)

+0

Tính năng tuyệt vời. –

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