一尘不染

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

php

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

阅读 308

收藏
2020-05-26

共1个答案

一尘不染

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

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

码:

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

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

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

2020-05-26