Можно ли выйти из области закрытия в php и доступ к переменной по ссылке? - PullRequest
1 голос
/ 07 августа 2011

пример:

$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 ]

2 голосов
/ 07 августа 2011

Вы делаете это так же, как любая другая функция, вы объявляете параметр как передача по ссылке :

$my_var = 'some text';
$my_closure = function(&$var) {
  $var = 'some other text';
};
$my_closure($my_var);
echo $my_var."\n";

Разрешение произвольного доступа к вызывающей области слишком опаснохотя и приведет к слишком многим проблемам.Замыкания в языках в целом, а не только в PHP, предназначены для доступа к закрытым / локальным переменным в той области, в которой они были определены (use() в PHP), но я не могу вспомнить ни одного, который позволял бы импроизвольный доступ к локальным пользователям в области вызова (даже к другим языкам сценариев).

0 голосов
/ 07 августа 2011

наконец нашел его, и я озадачен тем, что это было так очевидно:

$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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...