Использовать переменные внутри анонимной функции, которая определяется где-то еще

При использовании анонимных функций в 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 .

Но мне действительно нужен способ получить переменные из метода, из которого выполняется анонимная функция. Есть ли способ сделать это, когда анонимная функция объявлена ​​где-то еще.?

Related of "Использовать переменные внутри анонимной функции, которая определяется где-то еще"

Точкой ключевого слова use является наследование / закрытие определенного состояния среды из родительской области в Closure, когда оно определено , например

 $foo = 1; $fn = function() use ($foo) { return $foo; }; $foo = 2; echo $fn(); // gives 1 

Если вы хотите, чтобы $foo был закрыт в более поздней точке, либо определите закрытие позже, либо, если вы хотите, чтобы $foo всегда было текущим значением (2), передайте $foo в качестве обычного параметра.

FWIW, вы можете это сделать, если используете use reference на 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