Php 使用匿名函数作为参数访问外部变量
基本上,我使用这个方便的函数来处理db行(密切关注PDO和/或其他内容) 使用此功能,我可以简单地执行以下操作:Php 使用匿名函数作为参数访问外部变量,php,closures,scope,Php,Closures,Scope,基本上,我使用这个方便的函数来处理db行(密切关注PDO和/或其他内容) 使用此功能,我可以简单地执行以下操作: fetch("SELECT title FROM tbl", function($r){ //> $r['title'] contains the title }); 假设现在我需要在一个var中连接所有$r['title'](这只是一个示例) 我怎么能这么做?我是这样想的,但不是很优雅: $result = ''; fetch("SELECT title FROM t
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()参数是早期绑定-它们在
声明lambda函数的点,而不是
其中调用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次函数听起来也不是一个好主意。是否应该删除全局减速?+1强调早期绑定
。然而,我猜在上面的示例中,当use(&$result)
通过引用传递时,这并不重要?@DimitryK是的,这里使用引用来绕过默认行为(早期绑定)@machineaddict基本的使用
是早期绑定-如果您是指后期绑定的解决方法-您可以通过使用
通过引用传递变量-在调用匿名函数(或调用匿名函数的某物)之前,使用&
=>使用(&$result)
和更改$result
变量因为类实例总是通过引用传递的,所以您不需要对它们使用&for。(除非您完全覆盖该实例)。是的,您是对的。但是,如果您有兴趣在这里或那里获得一些ms,可以使用mysql\u fetch\u row()而不是mysql\u fetch\u assoc()。。。这很难处理,因为你必须知道自己的位置。通过这样做,您可以将每个30行的2000个请求从0.205传递到0.180。
$result = '';
fetch("SELECT title FROM tbl", function($r) use (&$result) {
$result .= $r['title'];
});
function fetch($query,$func) {
$query = mysql_query($query);
$retVal = array();
while($r = mysql_fetch_assoc($query)) {
$retVal[] = $r;
}
$func($retVal);
}