是否有可能通过引用达到php的闭包范围和访问变量?

时间:2011-08-07 06:14:27

标签: php closures

示例:

$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')));并且必须在声明闭包时使用,所以不是柔性的。

2 个答案:

答案 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。