我正在尝试将对象属性传递给闭包(位于该对象的方法之内),就像这样:
class Entity extends ControllerBase {
private $view;
private $events;
public function print($tid) {
self::loadView($tid);
self::loopView();
return (new StreamedResponse(function() use ($this->events){
...
}
}
}
$ events属性在loopView()
方法中实例化。这似乎应该对我有用,但出现此错误:
ParseError: syntax error, unexpected '->' (T_OBJECT_OPERATOR), expecting ',' or ')' in ...
似乎在说它不希望在use
中引用一个对象。我不知道为什么这是无效的,经过一番谷歌搜索之后,我找不到任何与我的特定问题相关的信息。
在PHP 7.1.7中,是否可以这样做,如果可以,正确的语法是什么?
答案 0 :(得分:5)
您可以仅在闭包中使用$this->events
,而无需使用use
语句。
请参见the anonymous function documentation中的“ $this
的自动绑定”。
从PHP 5.4.0开始,在类的上下文中声明时,当前类将自动绑定到该类,从而使$ this在函数范围内可用。
至于解析错误的原因,如果我们忽略特定的$this
情况,
function() use ($object->property) { ...
不起作用,因为use
将变量从父范围传递到闭包中,并且
$object->property
不是变量,而是表达式。
如果需要在闭包内引用对象属性,则需要use
整个对象,或者将该属性分配给可以use
的另一个变量。但是在这种情况下,您不必担心,因为$this
很特殊。