Использовать переменные внутри анонимной функции, которая определяется где-то еще
При использовании анонимных функций в 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
.
Но мне действительно нужен способ получить переменные из метода, из которого выполняется анонимная функция. Есть ли способ сделать это, когда анонимная функция объявлена где-то еще.?
Ответы
Ответ 1
Точка ключевого слова use
находится в наследовать/закрывать определенное состояние среды из родительской области в Closure, когда она определена, например
$foo = 1;
$fn = function() use ($foo) {
return $foo;
};
$foo = 2;
echo $fn(); // gives 1
Если вы хотите, чтобы $foo
был закрыт в более поздней точке, либо определите закрытие позже, либо, если вы хотите, чтобы $foo
всегда было текущим значением (2), передайте $foo
в качестве обычного параметра.
Ответ 2
FWIW, вы можете сделать это, если используете 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