Доступ к внешней переменной с использованием анонимной функции в качестве параметров

В основном я использую эту удобную функцию для обработки строк 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; 

Solutions Collecting From Web of "Доступ к внешней переменной с использованием анонимной функции в качестве параметров"

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

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

Код:

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

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

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

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

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

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