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

66bbxpm5  于 2023-03-21  发布在  PHP
关注(0)|答案(3)|浏览(162)

当在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并将其存储在一个变量中,然后将该变量传递给一个类的方法,这就是我想要运行 anonymous 函数的地方。
但是我不能使用use()关键字从method中获取$arg参数。因为 anonymous 函数是在method外部声明的。
但是我真的需要一种方法来从运行匿名函数的方法中获取变量。有没有一种方法可以做到这一点,当匿名函数在其他地方声明时..?

0wi1tuuw

0wi1tuuw1#

use关键字的目的是在Closure * 被定义 * 时将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),则将$foo作为常规参数传递。

2lpgd968

2lpgd9682#

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
sc4hvdpw

sc4hvdpw3#

在@chiliNUT answer的基础上构建,而不是将$arg设为全局变量,通过引用将其传递给MyClass构造函数:

class MyClass
{
    private
        $func,
        $arg;

    public function __construct ( $func , &$arg )
    {
        $this->func = $func;
        $this->arg = &$arg;
    }

    public function test ( $v )
    {
        $this->arg = $v;
        $closure =  $this->func;
        $closure ( 'anon func' );
    }
}

class RunIt
{
    public function run()
    {
        $arg = null;
        $bla = function($var1) use (&$arg)
        {
            echo $var1 . ' : ' . $arg;
        };
        $c = new MyClass($bla, $arg);
        $c->test ( 'this is arg' );
    }
}

(new RunIt())->run();

如果要允许任意数量的使用参数:

class MyClass
{
    private
        $func,
        $args;

    public function __construct ( $func , &...$args )
    {
        $this->func = $func;
        $this->args = &$args;
    }

    public function test ( ...$vs )
    {
        foreach($vs as $i => $v) if($i < count($this->args)) $this->args[$i] = $v;
        $closure =  $this->func;
        $closure ( 'anon func' );
    }
}

class RunIt
{
    public function run()
    {
        $arg1 = '';
        $arg2 = '';
        $arg3 = '';
        $bla = function($var1) use (&$arg1, &$arg2, &$arg3)
        {
            echo $var1 . ' : ' . $arg1 . ' : ' . $arg2 . ' : ' . $arg3;
        };
        $c = new MyClass($bla, $arg1, $arg2, $arg3);
        $c->test ( 'this is arg1', 'this is arg2' ); //$arg3 retains its previous value
    }
}

(new RunIt())->run();

相关问题