2011-12-06 12 views
73

Zasadniczo używam tego poręczną funkcję przetwarzania wiersze dB (zamknąć oko na PDO i/lub innych rzeczy)Dostęp zmienną poza użyciem funkcji anonimowej jako params

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

Dzięki tej funkcji można po prostu zrobić:

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

Załóżmy teraz, że muszę połączyć wszystkie $r['title'] w var (to tylko przykład).

Jak mogę to zrobić? Myślałam coś takiego, ale to nie jest bardzo elegancki:

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

echo $result; 

Odpowiedz

143

Musisz użyć use jak described in docs:

Zamknięcia mogą również dziedziczyć zmiennych z zakresu nadrzędnego. Wszelkie takie zmienne muszą być zadeklarowane w nagłówku funkcji. Dziedziczenie zmiennych z zakresu nadrzędnego nie jest tym samym, co używanie zmiennych globalnych . Zmienne globalne istnieją w zasięgu globalnym, który jest równy to samo, bez względu na to, jaka funkcja jest wykonywana.

Kod:

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

Ale uwaga (zaczerpnięte z jednego z komentarzy w poprzednim link):

użytku() parametry są wczesnego wiązania - używają wartość zmiennej w na punkt, w którym deklarowana jest funkcja lambda, a nie punkt , w którym wywoływana jest funkcja lambda (późne wiązanie).

+0

Czy to globalne spowolnienie nie powinno zostać usunięte? –

+0

Tak, oczywiście, dzięki za wskazanie :) – Xaerxess

+13

+1 za podkreślenie "wczesnego wiązania". Jednak w powyższym przykładzie, kiedy 'use (& $ result)' jest przekazywane przez odniesienie, tak naprawdę nie ma to znaczenia? –

0

Co powiesz na przepisanie "pobierania", aby zadzwonić do $ func tylko raz?

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

W ten sposób można nazwać $ func tylko raz i ponownie przetworzyć tablicę po pobraniu? Not sure about the performance nawet, że wywołanie 200 razy funkcji nie brzmi jak dobry pomysł.

+0

nie. to jest zabójca wydajności – dynamic

+0

Tak, masz rację. Jednak możesz użyć mysql_fetch_row() zamiast mysql_fetch_assoc(), jeśli chcesz zyskać kilka ms tu i tam ... jest to bardzo trudne, ponieważ musisz znać swoją pozycję w kolumnach. W ten sposób przechodzisz od 0.205 do 0.180 na 2000 żądaniach po 30 wierszy. – user103307

Powiązane problemy