При использовании анонимных функций в 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
.
Но мне действительно нужен способ получить переменные из метода, из которого выполняется анонимная функция. Есть ли способ сделать это, когда анонимная функция объявлена где-то еще.?
Точкой ключевого слова 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