2010-11-16 34 views
10

Có thể chuyển một hàm ẩn danh làm đối số và thực thi ngay lập tức, do đó chuyển giá trị return của hàm?PHP: Vượt qua chức năng ẩn danh làm đối số

function myFunction(Array $data){ 
    print_r($data); 
} 

myFunction(function(){ 
    $data = array(
     'fruit'  => 'apple', 
     'vegetable' => 'broccoli', 
     'other'  => 'canned soup'); 
    return $data; 
}); 

Điều này gây ra lỗi do yêu cầu loại Array, khiếu nại đối tượng được chuyển. Được rồi, nếu tôi loại bỏ gợi ý kiểu, tất nhiên nó sẽ thoát ra khỏi Closure Object, thay vì kết quả tôi muốn. Tôi hiểu rằng tôi về mặt kỹ thuật truyền một thể hiện đối tượng của Closure đến myFunction, tuy nhiên, tôi gần chắc chắn rằng tôi đã thấy điều này được thực hiện ở nơi khác. Điều này có thể không? Nếu vậy, tôi đang làm gì sai?

Vì mục đích của cuộc thảo luận này, tôi không thể sửa đổi chức năng mà tôi vượt qua phần đóng.

tl; dr: Làm cách nào tôi có thể chuyển một khai báo hàm ẩn danh làm đối số, dẫn đến giá trị trả về được chuyển làm đối số.

PS: Nếu không rõ ràng, các đầu ra mong muốn là:

Array 
(
    [fruit] => apple 
    [vegetable] => broccoli 
    [other] => canned soup 
) 
+0

Bạn đã có thể thấy điều này trong Javascript như '(function() {})()', nhưng chức năng của PHP không phải là linh hoạt. – deceze

Trả lời

9

Bạn không thể. Bạn sẽ phải gọi nó trước. Và vì PHP chưa hỗ trợ việc hủy tham chiếu, bạn phải lưu trữ nó trong một biến đầu tiên:

$f = function(){ 
    $data = array(
     'fruit'  => 'apple', 
     'vegetable' => 'broccoli', 
     'other'  => 'canned soup'); 
    return $data; 
}; 
myfunction($f()); 
+0

Cảm ơn * ircmaxell *; Darn, tôi cho rằng các bao đóng được truyền như các đối số mà tôi đã nhìn thấy được gọi vào một thời điểm nào đó trong phần thân của hàm mà chúng được chuyển đến. Quá tệ. – Dan

+7

Vài năm sau ... [có thể] (http://php.net/manual/en/functions.anonymous.php) – Alex

4

Bạn đang tự chuyển chính hàm đó chứ không phải kết quả như bạn đã nhận thấy. Bạn sẽ phải thực hiện chức năng đó ngay lập tức làm một cái gì đó như thế này:

myFunction((function() { 
    return ...; 
})(), $otherArgs); 

PHP không hỗ trợ những việc như vậy, vì vậy bạn buộc phải gán chức năng rằng một số biến và thực hiện nó:

$func = function() { ... }; 
myFunction($func(), $otherArgs); 
+13

Thật sao? Chúng ta có phải tiếp tục đi xuống con đường của PHP xấu hổ (nói rằng nó hút, không chỉ ra một sự thiếu hụt) điều này thường xuyên? Vì vậy, nhiều ghét ... Nếu bạn nghĩ rằng nó sucks, đó là tốt. Vượt qua nó ... – ircmaxell

+0

Cảm ơn * Crozin *; Tôi sẽ phải cân nhắc các lựa chọn khác. – Dan

7

Gần đây, tôi đã được giải quyết vấn đề tương tự vì vậy tôi đang đăng mã của tôi mà là làm việc như mong đợi:

$test_funkce = function ($value) 
{ 

    return ($value + 10); 
}; 


function Volej($funkce, $hodnota) 
{ 

    return $funkce->__invoke($hodnota); 
    //or alternative syntax 
    return call_user_func($funkce, $hodnota); 

} 

echo Volej($test_funkce,10); //prints 20 

Hy vọng nó giúp. Đầu tiên, tôi đang tạo ra đóng cửa, sau đó hàm sẽ chấp nhận đóng và đối số và sẽ gọi nó bên trong và trả về giá trị của nó. Đơn giản là đủ.

PS: Giải đáp nhờ vào câu trả lời này: answers

+0

Quá xấu câu trả lời này rất mới so với những người khác, nhưng điều này chắc chắn là những gì đã giúp tôi trong trường hợp của tôi, cảm ơn vì điều này! –

+0

Có rất ít tài nguyên tốt cho php chức năng nhưng thực sự php cư xử thực sự lạ khi tôi đang cố gắng một cái gì đó với đóng cửa. –

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