所以基本上我想像这样将当前对象变量传递给我的匿名函数:
$options = Option::whereHas('texts', function($query) use ($this->language) {
$query->where(['language_id' => $this->language->id, ]);
})->where(['active' => 1, ])
->get();
但是它给出了:
语法错误,意外的'->'(T_OBJECT_OPERATOR),预期为','或')'`。
无论如何,如果我将另一个变量设置为$this->language
并将其传递给匿名函数,它将正常工作。
$language = $this->language;
$options = Option::whereHas('texts', function($query) use ($language) {
$query->where(['language_id' => $language->id, ]);
})->where(['active' => 1, ])
->get();
那么,将对象变量传递给匿名函数中“使用”部分的正确方法是什么?
答案 0 :(得分:2)
从PHP 5.4.0开始,在类的上下文中声明时,当前类将自动绑定到它,从而使 $ this 在函数范围内可用。如果不需要当前类的这种自动绑定,则可以使用static anonymous functions。
由于在类内部使用了非静态匿名函数,因此$this
变量将自动绑定到该函数,而无需use
。这样可以很好地访问函数内部的语言。
$options = Option::whereHas('texts', function($query) {
$query->where(['language_id' => $this->language->id]);
})
->where(['active' => 1])
->get();
但是,如果您不想这样做,并且想要use
变量,则应将use
语句视为第二组已定义的参数。例如,您无法定义诸如function test($this) {}
或function test($obj->property) {}
之类的函数,因此您无法在use
语句中使用该格式。
您需要将要对匿名函数可用的任何内容分配给一个变量,然后use
将该变量分配。