在PHP中使用匿名函数时,您可以使用use()
关键字轻松地使用其范围之外的变量。
在我的情况下,匿名函数已在某处定义,但稍后在(在其他地方)类中调用。
以下代码是为了说明这个想法:
<?php
$bla = function ( $var1 ) use ($arg)
{
echo $var1;
};
class MyClass
{
private $func;
public function __construct ( $func )
{
$this->func = $func;
}
public function test ( $arg )
{
$closure = $this->func;
$closure ( 'anon func' );
}
}
$c = new MyClass($bla);
$c->test ( 'anon func' );
我正在做的是创建一个anonymous function
并将其存储在一个变量中。我将该变量传递给类的方法,这是我想要运行匿名函数的地方。
但我无法使用use()
关键字以$arg
方式获取method
参数。因为匿名函数是在method
之外声明的。
但我真的需要一种方法来从运行匿名函数的方法中获取变量。当匿名函数在其他地方声明时,有没有办法做到这一点??
答案 0 :(得分:18)
use
关键字的点是inherit/close over a particular environment state from the parent scope进入Closure 时的定义,例如
$foo = 1;
$fn = function() use ($foo) {
return $foo;
};
$foo = 2;
echo $fn(); // gives 1
如果您希望稍后关闭$foo
,请稍后定义闭包,或者如果您希望$foo
始终是当前值(2),则传递{{1} }作为常规参数。
答案 1 :(得分:0)
FWIW,你可以使用use reference
(php.net ex 3.3)和全局,丑陋,因为它使用全局变量,但只是把它放在那里:
<?php
$bla = function ( $var1 ) use (&$arg)
{
return "var1:$var1, arg:$arg";
};
class MyClass
{
private $func;
public function __construct ( $func )
{
$this->func = $func;
}
public function test ( $param )
{
global $arg;
$arg=$param;
$closure = $this->func;
return $closure ( 'anon func' );
}
}
$c = new MyClass($bla);
echo $c->test ( 'bla bla' ); //var1:anon func, arg:bla bla