Доступ к внешней переменной с использованием анонимной функции в качестве параметров
В основном я использую эту удобную функцию для обработки строк db (закрывайте глаза на 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;
Ответы
Ответ 1
Вы должны использовать use
как описанный в документах:
Закрытие также может наследовать переменные из родительской области. Любая такая переменные должны быть объявлены в заголовке функции. Наследование переменные из родительской области не совпадают с использованием глобальных переменные. Глобальные переменные существуют в глобальном масштабе, независимо от того, какая функция выполняет.
код:
$result = '';
fetch("SELECT title FROM tbl", function($r) use (&$result) {
$result .= $r['title'];
});
Но будьте осторожны (взяты из одного из комментариев в предыдущей ссылке):
Параметры use() являются ранними связями - они используют значение переменной в точка, где объявлена лямбда-функция, а не точка где лямбда-функция называется (поздняя привязка).
Ответ 2
Как насчет перезаписи 'fetch' для вызова $func только один раз?
function fetch($query,$func) {
$query = mysql_query($query);
$retVal = array();
while($r = mysql_fetch_assoc($query)) {
$retVal[] = $r;
}
$func($retVal);
}
Таким образом, вы могли бы вызывать $func только один раз и повторно обрабатывать массив после извлечения?
Не уверен в производительности даже при вызове 200 раз функция не похожа на хорошую идею.