使用匿名函数作为参数访问外部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听起来不是一个好主意。