在PHP中将对象属性传递给闭包

use*_*841 2 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){
      ...
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

$ events属性在loopView()方法中实例化.这似乎应该对我有用,但我得到这个错误:

ParseError: syntax error, unexpected '->' (T_OBJECT_OPERATOR), expecting ',' or ')' in ...
Run Code Online (Sandbox Code Playgroud)

它似乎在说它不希望有一个引用的对象use.我不知道为什么这是无效的,经过一些谷歌搜索,我找不到任何引用我的具体问题.

在PHP 7.1.7中,是否可以执行此操作,如果是,那么正确的语法是什么?

Don*_*nic 7

您可以$this->events在没有use声明的情况下使用闭包.

请参阅匿名函数文档$this "自动绑定" .

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

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


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

function() use ($object->property) { ...
Run Code Online (Sandbox Code Playgroud)

不起作用,因为use变量从父作用域传递到闭包,而
$object->property不是变量,它是一个表达式.

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