Php 在其他地方定义的匿名函数中使用变量

Php 在其他地方定义的匿名函数中使用变量,php,closures,anonymous-function,Php,Closures,Anonymous Function,在PHP中使用匿名函数时,通过使用use()关键字,可以轻松地使用其范围之外的变量 在我的例子中,匿名函数已经在某个地方定义了,但是后来在类中(在其他地方)调用了 下面的代码是为了说明这个想法: <?php $bla = function ( $var1 ) use ($arg) { echo $var1; }; class MyClass { private $func; public function __c

在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' );

使用
关键字的要点是在定义闭包时插入闭包,例如


如果希望以后关闭
$foo
,请稍后定义关闭,或者如果希望
$foo
始终为当前值(2),将
$foo
作为常规参数传递。

FWIW,如果使用
使用引用
(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

将其作为参数传递。@NiclasLarsson我不能这么做。因为我需要通过
匿名函数
中的
引用
来更改参数。我可以从
test()
方法内部使用
func\u get\u args
轻松获取值。然后在那里将这些值传递给
匿名函数
,但这样它只会得到值的
副本。我需要有一个
引用
。你不能使用引用运算符(&)通过引用传递它们吗?@NiclasLarsson by reference不会使其更改范围。在OP的示例中,$arg仍然指向全局范围中的$arg。我知道OP希望闭包使用执行它的作用域中的$arg,例如MyClass::test($arg)。但也许OP可以澄清,我希望我忽略了什么。但是显然,没有其他方法可以将所需的变量作为参数传递。您应该提到它被称为“词汇作用域”。所有现代编程语言都使用词法作用域。
<?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