基本上我使用这个方便的函数来处理数据库行(关注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
});
现在假设我需要在var中连接所有$r['title']
(这只是一个例子)。
我怎么能这样做?我在想这样的事情,但它不是很优雅:
$result = '';
fetch("SELECT title FROM tbl", function($r){
global $result;
$result .= $r['title'];
});
echo $result;
答案 0 :(得分:176)
您必须将use
用作described in docs:
闭包还可以从父作用域继承变量。任何这样的 变量必须在函数头中声明。继承 父作用域中的变量与使用全局不同 变量。全局变量存在于全局范围内,即 无论执行什么功能都一样。
代码:
$result = '';
fetch("SELECT title FROM tbl", function($r) use (&$result) {
$result .= $r['title'];
});
但要注意(取自上一个链接中的一条评论):
use()参数是早期绑定 - 它们使用变量的值 声明lambda函数的点,而不是点 调用lambda函数的地方(后期绑定)。
答案 1 :(得分:0)
重写'fetch'只调用一次$ func怎么样?
function fetch($query,$func) {
$query = mysql_query($query);
$retVal = array();
while($r = mysql_fetch_assoc($query)) {
$retVal[] = $r;
}
$func($retVal);
}
这样你只需调用$ func一次,并在获取后重新处理数组? 不确定性能,即使调用200次函数听起来也不是一个好主意。