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

Php 使用匿名函数作为参数访问外部变量,php,closures,scope,Php,Closures,Scope,基本上,我使用这个方便的函数来处理db行(密切关注PDO和/或其他内容) 使用此功能,我可以简单地执行以下操作: fetch("SELECT title FROM tbl", function($r){ //> $r['title'] contains the title }); 假设现在我需要在一个var中连接所有$r['title'](这只是一个示例) 我怎么能这么做?我是这样想的,但不是很优雅: $result = ''; fetch("SELECT title FROM t

基本上,我使用这个方便的函数来处理db行(密切关注PDO和/或其他内容)

使用此功能,我可以简单地执行以下操作:

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;

您必须使用
使用
作为:

闭包也可以从父范围继承变量。任何这样的 变量必须在函数头中声明。继承 父范围中的变量与使用全局变量不同 变量。全局变量存在于全局范围中,即 无论执行什么函数,都是相同的

代码:

但请注意(摘自上一链接中的一条评论):

use()参数是早期绑定-它们在 声明lambda函数的点,而不是 其中调用lambda函数(后期绑定)


重写“fetch”只调用$func一次怎么样

function fetch($query,$func) {
    $query = mysql_query($query);   
    $retVal = array();
    while($r = mysql_fetch_assoc($query)) {
        $retVal[] = $r;
    }
    $func($retVal);
}
这样,您将只调用$func一次,并在获取后重新处理数组?
不确定性能,即使调用200次函数听起来也不是一个好主意。

是否应该删除全局减速?+1强调
早期绑定
。然而,我猜在上面的示例中,当
use(&$result)
通过引用传递时,这并不重要?@DimitryK是的,这里使用引用来绕过默认行为(早期绑定)@machineaddict基本的
使用
是早期绑定-如果您是指后期绑定的解决方法-您可以通过
使用
通过引用传递变量-在调用匿名函数(或调用匿名函数的某物)之前,使用
&
=>
使用(&$result)
和更改
$result
变量因为类实例总是通过引用传递的,所以您不需要对它们使用&for。(除非您完全覆盖该实例)。是的,您是对的。但是,如果您有兴趣在这里或那里获得一些ms,可以使用mysql\u fetch\u row()而不是mysql\u fetch\u assoc()。。。这很难处理,因为你必须知道自己的位置。通过这样做,您可以将每个30行的2000个请求从0.205传递到0.180。
$result = '';
fetch("SELECT title FROM tbl", function($r) use (&$result) {
   $result .= $r['title'];
});
function fetch($query,$func) {
    $query = mysql_query($query);   
    $retVal = array();
    while($r = mysql_fetch_assoc($query)) {
        $retVal[] = $r;
    }
    $func($retVal);
}