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

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