11

在 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.

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

4

2 回答 2

20

use关键字的重点是在定义时将特定环境状态从父范围继承/关闭到闭包中,例如

$foo = 1;

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

$foo = 2;

echo $fn(); // gives 1

如果您想$foo稍后关闭,请稍后定义关闭,或者,如果您想$foo始终保持当前值 (2),$foo则作为常规参数传递。

于 2013-01-03T12:28:33.413 回答
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
于 2017-02-17T17:35:17.070 回答