为了账号安全,请及时绑定邮箱和手机立即绑定

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

/ 猿问

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

PHP
拉丁的传说 2019-11-14 10:43:45

基本上,我使用此方便的函数来处理数据库行(请注意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'](这只是一个示例)。


我该怎么办?我当时在想像这样的东西,但是它不是很优雅:


$result = '';

fetch("SELECT title FROM tbl", function($r){

   global $result;

   $result .= $r['title'];

});


echo $result;


查看完整描述

3 回答

?
慕少森

你必须使用use如在文档中所述:


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


码:


$result = '';

fetch("SELECT title FROM tbl", function($r) use (&$result) {

   $result .= $r['title'];

});

但是要当心(摘自上一链接的评论之一):


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


查看完整回答
反对 回复 2019-11-14
?
慕仙森

重写'fetch'只调用$ func一次呢?


function fetch($query,$func) {

    $query = mysql_query($query);   

    $retVal = array();

    while($r = mysql_fetch_assoc($query)) {

        $retVal[] = $r;

    }

    $func($retVal);

}

这样,您将只调用一次$ func并在获取后重新处理该数组?即使对函数调用200次也不是很确定的效果。


查看完整回答
反对 回复 2019-11-14
?
慕仰1329654

如果您有兴趣在此处和那里获取几毫秒的信息,则可以使用mysql_fetch_row()代替mysql_fetch_assoc()...由于要知道列的位置,因此很难处理。这样,您就可以在2000个请求(每个请求30行)中从0.205传递到0.180。

查看完整回答
反对 回复 2019-11-14

添加回答

回复

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信