将对象属性传递给PHP的闭包

时间:2019-02-08 21:51:01

标签: php closures

我正在尝试将对象属性传递给闭包(位于该对象的方法之内),就像这样:

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中,是否可以这样做,如果可以,正确的语法是什么?

1 个答案:

答案 0 :(得分:5)

您可以仅在闭包中使用$this->events,而无需使用use语句。

请参见the anonymous function documentation中的“ $this的自动绑定”。

  

从PHP 5.4.0开始,在类的上下文中声明时,当前类将自动绑定到该类,从而使$ this在函数范围内可用。

例如:https://3v4l.org/gYdHp


至于解析错误的原因,如果我们忽略特定的$this情况,

function() use ($object->property) { ...

不起作用,因为use变量从父范围传递到闭包中,并且
$object->property不是变量,而是表达式。

如果需要在闭包内引用对象属性,则需要use整个对象,或者将该属性分配给可以use的另一个变量。但是在这种情况下,您不必担心,因为$this很特殊。