web-dev-qa-db-fra.com

Accès à une variable extérieure en utilisant une fonction anonyme comme paramètres

Fondamentalement, j'utilise cette fonction pratique pour traiter les lignes de base de données (fermez un œil sur PDO et/ou d'autres choses)

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

Avec cette fonction, je peux simplement faire:

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

Disons maintenant que je dois concaténer tout $r['title'] dans un var (ce n'est qu'un exemple).

Comment pourrais-je faire ça? Je pensais à quelque chose comme ça, mais ce n'est pas très élégant:

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

echo $result;
89
dynamic

Vous devez utiliser use comme décrit dans la documentation :

Les fermetures peuvent également hériter des variables de la portée parent. Ces variables doivent être déclarées dans l'en-tête de la fonction. Hériter des variables de la portée parent n'est pas la même chose que d'utiliser des variables globales. Les variables globales existent dans la portée globale, qui est la même quelle que soit la fonction exécutée.

Code:

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

Mais attention (extrait d'un des commentaires du lien précédent):

les paramètres use () sont une liaison anticipée - ils utilisent la valeur de la variable au point où la fonction lambda est déclarée, plutôt que le point où la fonction lambda est appelée (liaison tardive).

178
Xaerxess

Qu'en est-il de réécrire 'fetch' pour appeler $ func une seule fois?

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

De cette façon, vous n'appeleriez $ func qu'une seule fois et retraiteriez le tableau une fois récupéré? Je ne suis pas sûr de la performance même si appeler 200 fois une fonction ne semble pas être une bonne idée.

0
user103307