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

基本上我使用这个方便的function来处理数据库行(密切关注PDO和/或其他东西)

function fetch($query,$func) { $query = mysql_query($query); while($r = mysql_fetch_assoc($query)) { $func($r); } } 

有了这个function,我可以简单地做到:

 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

闭包也可能inheritance父范围的variables。 任何这样的variables都必须在函数头部声明。 从父范围inheritancevariables与使用全局variables不同。 全局variables存在于全局范围内,无论执行什么function都是一样的。

码:

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

但要小心(从以前的链接中的意见之一):

use()参数是早期绑定的 – 它们在声明lambda函数的地方使用variables的值,而不是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次function听起来不是一个好主意。