使用匿名函数作为参数访问外部变量

时间:2011-12-06 17:11:59

标签: php closures scope

基本上我使用这个方便的函数来处理数据库行(关注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;

2 个答案:

答案 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次函数听起来也不是一个好主意。