Доступ к внешней переменной с использованием анонимной функции в качестве параметра - PullRequest
88 голосов
/ 06 декабря 2011

В основном я использую эту удобную функцию для обработки строк в БД (закройте глаза на PDO и / или другие вещи)

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

С помощью этой функции я могу просто сделать:

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

Допустим, теперь мне нужно объединить все $r['title'] в var (это всего лишь пример).

Как я мог это сделать? Я думал, что-то вроде этого, но это не очень элегантно:

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

echo $result;

Ответы [ 2 ]

178 голосов
/ 06 декабря 2011

Вы должны использовать use как , описанное в документации :

Замыкания также могут наследовать переменные из родительской области.Любые такие переменные должны быть объявлены в заголовке функции.Наследование переменных из родительской области - это не то же самое, что использование глобальных переменных.Глобальные переменные существуют в глобальной области видимости, которая одинакова независимо от выполняемой функции.

Код:

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

Но будьте осторожны (взято из одного из комментариев в предыдущей ссылке):

Параметры use () имеют раннее связывание - они используют значение переменной в точке, где объявлена ​​лямбда-функция, а не в точке, где вызывается лямбда-функция (позднее связывание).

0 голосов
/ 06 декабря 2011

А как насчет переписывания 'fetch' для вызова $ func только один раз?

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

Таким образом, вы бы вызывали $ func только один раз и повторно обрабатывали массив после извлечения? Не уверен в производительности, даже если 200-кратный вызов функции не звучит как хорошая идея.

...