ti-enxame.com

Acessando variável externa usando a função anônima como parâmetros

Basicamente, eu uso essa função útil para processar linhas de banco de dados (observe o DOP e/ou outras coisas)

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

Com esta função eu posso simplesmente fazer:

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

Digamos que agora eu preciso concatenar tudo $r['title'] em uma var (este é apenas um exemplo).

Como eu pude fazer isso? Eu estava pensando algo assim, mas não é muito elegante:

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

echo $result;
89
dynamic

Você precisa usar use como descrito nos documentos :

Os fechamentos também podem herdar variáveis ​​do escopo pai. Quaisquer variáveis ​​devem ser declaradas no cabeçalho da função. Herdar variáveis ​​do escopo pai não é o mesmo que usar variáveis ​​globais. Variáveis ​​globais existem no escopo global, que é o mesmo, independentemente da função que está sendo executada.

Código:

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

Mas cuidado (retirado de um dos comentários no link anterior):

os parâmetros use () são ligação antecipada - eles usam o valor da variável no ponto em que a função lambda é declarada, em vez do ponto em que a função lambda é chamada (ligação tardia).

178
Xaerxess

Que tal reescrever 'buscar' para chamar $ func apenas uma vez?

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

Dessa forma, você chamaria $ func apenas uma vez e processaria novamente a matriz uma vez buscada? Não tenho certeza sobre o desempenho, mesmo chamando 200 vezes uma função, não parece uma boa idéia.

0
user103307