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

时间:2013-01-03 12:24:51

标签: php closures anonymous-function

在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之外声明的。

但我真的需要一种方法来从运行匿名函数的方法中获取变量。当匿名函数在其他地方声明时,有没有办法做到这一点??

2 个答案:

答案 0 :(得分:18)

use关键字的点是inherit/close over a particular environment state from the parent scope进入Closure 时的定义,例如

$foo = 1;

$fn = function() use ($foo) {
    return $foo;
};

$foo = 2;

echo $fn(); // gives 1

如果您希望稍后关闭$foo,请稍后定义闭包,或者如果您希望$foo始终是当前值(2),则传递{{1} }作为常规参数。

答案 1 :(得分:0)

FWIW,你可以使用use referencephp.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