示例:
$my_var = 'some text';
$my_closure = function($variable_name) {
//here some magic...
$$variable_name = 'some other text';
};
$my_closure('my_var');
echo $my_var //-> 'some other text';
我现在知道的唯一方法是在闭包声明中使用compact()
或use()
,但紧凑看起来像这个extract($my_closure(compact('my_var')));
并且必须在声明闭包时使用,所以不是柔性的。
答案 0 :(得分:2)
您可以将其与任何其他函数相同,将参数声明为pass-by-reference:
$my_var = 'some text';
$my_closure = function(&$var) {
$var = 'some other text';
};
$my_closure($my_var);
echo $my_var."\n";
允许任意访问调用范围是非常危险的,并且会导致太多问题。一般语言中的闭包,而不仅仅是PHP,旨在能够访问它们在(PHP中的use()
)中定义的范围内的私有/局部变量,但我想不到允许的单个变量他们可以随意访问调用范围内的本地人(甚至其他脚本语言)。
答案 1 :(得分:0)
终于找到了它,我很困惑,它是如此明显:
$outside_var = 'wrong';
$closure = function($var_name,$new_value) {
global $$var_name; // SO OBVIOUS!!!
$$var_name = $new_value;
};
echo $outside_var."\n";
$closure('outside_var','right');
echo $outside_var."\n";
不幸的是,限制是必须在闭包之前声明变量,否则变量为NULL。