2011-12-06 29 views
73

Về cơ bản tôi sử dụng chức năng hữu ích này để chế biến hàng db (đóng một mắt trên PDO và/hoặc các công cụ khác)Truy cập biến bên ngoài sử dụng chức năng ẩn danh như params

function fetch($query,$func) { 
    $query = mysql_query($query); 
    while($r = mysql_fetch_assoc($query)) { 
     $func($r); 
    } 
} 

Với chức năng này, tôi chỉ có thể làm:

fetch("SELECT title FROM tbl", function($r){ 
    //> $r['title'] contains the title 
}); 

Giả sử bây giờ tôi cần ghép tất cả $r['title'] trong một var (đây chỉ là một ví dụ).

Tôi có thể làm như thế nào? Tôi đã suy nghĩ một cái gì đó như thế này, nhưng nó không phải rất thanh lịch:

$result = ''; 
fetch("SELECT title FROM tbl", function($r){ 
    global $result; 
    $result .= $r['title']; 
}); 

echo $result; 

Trả lời

143

Bạn phải sử dụng use như described in docs:

đóng cửa cũng có thể kế thừa biến từ phạm vi phụ huynh. Mọi biến số như vậy phải được khai báo trong tiêu đề hàm. Thừa kế biến từ phạm vi gốc không giống như sử dụng biến số toàn cầu . Các biến toàn cục tồn tại trong phạm vi toàn cầu, là tương tự cho dù chức năng nào đang thực thi.

Code:

$result = ''; 
fetch("SELECT title FROM tbl", function($r) use (&$result) { 
    $result .= $r['title']; 
}); 

Nhưng hãy cẩn thận (lấy từ một trong những ý kiến ​​trong liên kết trước đó):

sử dụng() thông số đầu ràng buộc - họ sử dụng giá trị của biến tại sự điểm mà hàm lambda được khai báo, chứ không phải là điểm nơi hàm lambda được gọi (kết thúc muộn).

+0

Không nên giảm tốc toàn cầu? –

+0

Vâng, tất nhiên, cảm ơn vì đã chỉ ra nó :) – Xaerxess

+13

+1 để nhấn mạnh 'ràng buộc sớm'. Tuy nhiên tôi đoán trong ví dụ trên khi 'sử dụng (& $ result)' được truyền bằng tham chiếu nó không thực sự quan trọng? –

0

Điều gì về việc viết lại 'tìm nạp' để gọi $ func chỉ một lần?

function fetch($query,$func) { 
    $query = mysql_query($query); 
    $retVal = array(); 
    while($r = mysql_fetch_assoc($query)) { 
     $retVal[] = $r; 
    } 
    $func($retVal); 
} 

Bằng cách này bạn sẽ chỉ gọi $ func một lần và xử lý lại mảng sau khi tìm nạp? Không chắc chắn về hiệu suất thậm chí tho gọi 200 lần một chức năng không âm thanh như một ý tưởng tốt.

+0

không. đây là một kẻ giết người hiệu suất – dynamic

+0

Có bạn đúng. Tuy nhiên, bạn có thể sử dụng mysql_fetch_row() thay vì mysql_fetch_assoc() nếu bạn quan tâm đến việc đạt được một vài ms ở đây và ở đó ... nó chỉ là hết sức khó khăn để đối phó với như bạn phải biết vị trí cột của bạn. Bằng cách làm như vậy, bạn vượt qua từ 0,205 đến 0,180 trên 2000 yêu cầu của 30 hàng mỗi. – user103307

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