【发布时间】:2019-07-23 15:36:29
【问题描述】:
PHP 是否支持 use 在 Closure 范围内创建一个局部变量,即使这个变量是通过 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.anonymous 或closure.fromcallable 中找不到任何见解。
【问题讨论】:
-
我可以看到一个问题是
use允许访问封装调用的范围 - 但是可以在方法 A 中定义闭包(因此use在 A 中定义)然后调用在方法 B - 那么它使用哪个范围。 -
合法观察... ????
标签: php scope closures callable-object