【问题标题】:How to `use` variables inside a closure created with `Closure::fromCallback()`?如何在使用`Closure::fromCallback()`创建的闭包中`使用`变量?
【发布时间】:2019-07-23 15:36:29
【问题描述】:

PHP 是否支持 useClosure 范围内创建一个局部变量,即使这个变量是通过 Closure::fromCallable() 创建的?

通常我会这样做

$value = 'foobar';
$callback = function() use (&$value) {
    $value .= ' string';
    return $value;
};
var_export($callback());  // prints 'foobar string'

但是当有更复杂的代码时,我如何获得相同的结果?

class A
{
    public function __construct()
    {
        $value = 'foobar';
        $callback = Closure::fromCallable([ $this, 'myCallable' ]);

        var_export( $callback() );
    }

    protected function myCallable()
    {
        $value .= ' string';
        return $value;
    }
}

我知道在这种情况下我可以将值作为可调用参数传递,但我之所以写这篇文章是因为对 PHP 的工作原理感到好奇。

另外,是的,在 myCallable 中使用 $value 而不在任何地方声明它是非常荒谬的。但是,这更多是关于好奇心而不是正确性????

我已经尝试过$callback = Closure::fromCallable([ $this, 'myCallable' ]) use ($value);,但它失败并出现语法错误。

fromCallable 方法不应该支持在闭包的范围内传递我们想要的变量,替换use 语句的功能吗?

我在functions.anonymousclosure.fromcallable 中找不到任何见解。

【问题讨论】:

  • 我可以看到一个问题是 use 允许访问封装调用的范围 - 但是可以在方法 A 中定义闭包(因此 use 在 A 中定义)然后调用在方法 B - 那么它使用哪个范围。
  • 合法观察... ????

标签: php scope closures callable-object


【解决方案1】:

如果你能这样解决呢:

class A
{
    private $value;

    public function __construct()
    {
        $this->value = 'foobar';
        $callback = Closure::fromCallable([ $this, 'myCallable'  ]);

        var_export( $callback() );
    }

    protected function myCallable()
    {
        $this->value .= ' string'; 
        return $this->value;
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-08-15
    • 2016-03-18
    • 2023-03-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多