2010-10-05 31 views
30

Tôi đã cố gắng mượn một số mô hình lập trình từ JS đến PHP (chỉ để cho vui). Có một cách để thực hiện:Tự thực hiện các chức năng trong PHP5.3?

$a = (function(){ 
    return 'a'; 
})(); 

Tôi đã suy nghĩ rằng với sự kết hợp của use này có thể là một cách tốt đẹp để giấu biến JS phong cách

$a = (function(){ 
    $hidden = 'a'; 
    return function($new) use (&$hidden){ 
     $hidden = $new; 
     return $hidden; 
    }; 
})(); 

ngay bây giờ tôi cần phải làm:

$temp = function(){....}; 
$a = $temp(); 

Có vẻ như vô nghĩa ...

+1

khó hiểu đối với tôi ... :) chính xác những gì bạn có nghĩa là .. –

+0

Tôi là một chút bối rối những gì bạn đang cố gắng để thực hiện hoặc tại sao bạn muốn thực hiện các chức năng theo cách này. Mặc dù tôi khá chắc chắn không có cách nào để đóng gói một hàm giống như vậy trong PHP. Các hàm trong javascript được thực hiện như các lớp, trong khi trong PHP chúng là các hàm thực tế. Vì lý do này, tất cả chúng tồn tại trong một không gian tên chung, không phải trong không gian tên khép kín của chúng. Điều gần nhất với một "chức năng tự gọi" mà tôi có thể hình dung là xác định hàm trong 'eval()' – stevendesu

+0

XiroX: bạn có nên cân nhắc đặt câu hỏi không? – salathe

Trả lời

51

Function Call Chaining, e.g. foo()() is in discussion for PHP5.4. Cho đến lúc đó, sử dụng call_user_func:

$a = call_user_func(function(){ 
    $hidden = 'a'; 
    return function($new) use (&$hidden){ 
     $hidden = $new; 
     return $hidden; 
    }; 
}); 

$a('foo');  
var_dump($a); 

cho:

object(Closure)#2 (2) { 
    ["static"]=> 
    array(1) { 
    ["hidden"]=> 
    string(3) "foo" 
    } 
    ["parameter"]=> 
    array(1) { 
    ["$new"]=> 
    string(10) "<required>" 
    } 
} 

Tính đến PHP7, bạn ngay lập tức có thể thực hiện các chức năng vô danh như thế này:

(function() { echo 123; })(); // will print 123 
+0

Bạn có thể cập nhật thông tin này không? Sẽ được đánh giá cao. –

+1

@Hanoncs được cập nhật cho php7 – Gordon

+3

Tuyệt vời, tôi không có nghi ngờ điều này sẽ là một giá trị cho cộng đồng và các googlers trong tương lai. –

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