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

2022-08-30 07:32:29

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

答案 1

您必须按照文档中的说明使用:use

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

法典:

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

但要小心(摘自上一个链接中的一条评论):

use() 参数是早期绑定 - 它们在声明 lambda 函数的点使用变量的值,而不是调用 lambda 函数的点(后期绑定)。


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


推荐