2010-03-09 32 views

Trả lời

33

Tôi không nghĩ rằng đây là có thể với PHP 5.2 ...

Với PHP 5.3, tuy nhiên, bạn có thể có thể sử dụng một đóng cửa, để làm điều đó ...


Edit: mất một thời gian để nhớ cú pháp, nhưng đây là những gì nó sẽ giống như sau:

function foo() 
{ 
    $l = "xyz"; 
    $bar = function() use ($l) 
    { 
     var_dump($l); 
    }; 
    $bar(); 
} 
foo(); 

Và, chạy kịch bản, bạn sẽ nhận được:

$ php temp.php 
string(3) "xyz" 


Một vài lưu ý:

  • Bạn phải đặt một ; sau tuyên bố của chức năng!
  • Bạn có thể use biến bằng cách tham chiếu, với một & trước tên của nó: use (& $l)

Để biết thêm thông tin, như một tài liệu tham khảo, bạn có thể có một cái nhìn tại trang này trong cuốn hướng dẫn: Anonymous functions

+0

Tại sao bạn sử dụng chức năng lồng nhau? –

+0

Ai biết được ^^ Đó không phải là câu hỏi ^^ ;; với PHP 5.3 và các hàm ẩn danh, nó có thể khá hữu ích cho các đóng cửa ;;; Trước PHP 5.3 ... Tôi chưa bao giờ sử dụng bất kỳ hàm lồng nhau nào với PHP <5.3. –

+2

@PascalMARTIN Quan trọng, hàm lồng nhau trước PHP 5.3 _do not exist_. Mặc dù trông giống như họ đang tuyên bố tại địa phương, họ kết thúc trong phạm vi toàn cầu. Tôi nghĩ điều tương tự cũng đúng, đó là lý do tại sao bạn phải sử dụng các hàm ẩn danh để đạt được bất kỳ loại lồng nào. – Izkata

4

Trong PHP 5.3, bạn phải sử dụng từ khóa use.

$bar = function() use(&$l) { 
}; 
$bar(); 

Trong bản PHP 5.2 trở về trước, điều này sẽ không hoạt động. Cú pháp bạn đã có không phải là một đóng cửa, nhưng định nghĩa của một chức năng toàn cầu.

function foo() { function bar() { } } 

hoạt động giống như:

function foo() { include "file_with_function_bar.php"; } 

Nếu bạn thực hiện chức năng foo hai lần, PHP sẽ phàn nàn rằng bạn đã cố gắng để tái xác định (toàn cầu) chức năng bar.

+0

Quá nhiều đại từ! Điều gì sẽ chết trong lần thực thi thứ hai? Biến bên ngoài, hoặc biến như 'use''d trong hàm bên trong? Và cái chết có ý nghĩa gì (không bị lén lút, chỉ muốn biết). Chết có nghĩa là biến không thể được sử dụng hoặc nó phải được thiết lập lại bởi một số phương tiện khác? Tôi đoán nó chết (theo bất kỳ nghĩa nào) vì nó chia sẻ vị trí mà cả hai đều không thể được chỉ lại sau khi thực hiện lần đầu tiên? Điều gì sẽ xảy ra nếu biến được tạo thành tĩnh và sau đó không được đặt ngay sau đó? – Anthony

+0

chết nghĩa là 'chết' ("Lỗi nghiêm trọng") '.Không có các bao đóng và hàm bên trong trong PHP <= 5.2 - hàm bên trong hàm không được phép, và thực tế nó không phải là lỗi cú pháp là ngẫu nhiên (nó nên là lỗi sytnax). PHP 5.3 hoàn toàn khác. Nó cho phép các hàm bên trong các hàm, nhưng với cú pháp hơi khác một chút. Khi bạn nhận được cú pháp đúng, trong PHP 5.3+, nó sẽ hoạt động như bạn mong đợi ở các ngôn ngữ khác. – Kornel

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