【问题标题】:Passing an object property into a closure in PHP将对象属性传递给 PHP 中的闭包
【发布时间】:2019-07-03 04:29:27
【问题描述】:

我正在尝试将对象属性传递给闭包(在该对象的方法中),如下所示:

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

【问题讨论】:

  • $this->events 传递到一个新变量中,因为$this 在任何函数中都有另一个含义
  • 最坏的情况,你可以设置$evt = $this->events然后把它传递给use()

标签: php closures


【解决方案1】:

您可以只在闭包中使用$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 是特殊的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-09-20
    • 1970-01-01
    • 2019-06-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-20
    • 2017-06-21
    相关资源
    最近更新 更多